1.package.json
(1)波浪号~+指定版本:比如 “babel-plugin-import”: “~1.1.0”,表示安装1.1.x的最新版本(不低于1.1.0),但是不安装1.2.x,也就是说安装时不改变大版本号和次要版本号
(2)^+指定版本:比如 “antd”: “^3.1.4”,,表示安装3.1.4及以上的版本,但是不安装4.0.0,也就是说安装时不改变大版本号。
(3)如果入口(main)未指定,那么就默认加载index.js
2.npm常用功能
1.install
1.npm install == npm i
npm会根据package.json配置文件中的依赖配置下载安装至node_modules文件夹
2.-global == -g
全局安装,安装后的包位于系统预设目录下
不会在项目node_modules目录中保存模块包
不会将模块依赖写入devDependencies或dependencies 节点
运行 npm install 初始化项目时不会下载模块
3.--save == -S
安装的包将写入package.json里面的dependencies,dependencies:生产环境需要依赖的库
4.--save-dev == -D
安装的包将写入packege.json里面的devDependencies,devdependencies:只有开发环境下需要依赖的库
3.node实用模块
1.lodash,可以深拷贝
_.cloneDeep(value)
2.randexp,根据正则生成字符串(随机)
const RandExp = require('randexp');
console.log(new RandExp(/[1-9]/).gen());
3.cheerio,作为后端的jquery,可以操作dom元素,避免书写复杂的正则
const cheerio = require('cheerio')
$('img[class="ui image lazy"]').each(function(i,item){
let obj ={
href: $(this).attr('data-original'),
alt: $(this).attr('alt').slice(0,12).replace(/[<>"\?\/\:&\|\\\*^%$#@\-]/g,"")
}
})
4.Puppeter,生成无头浏览器作为自动化测试或者爬虫的工具,还可以抓取 SPA(单页应用)并生成预渲染内容(即“SSR”(服务器端渲染))。
const puppeteer = require('puppeteer');(async () => {
const browser = await puppeteer.launch({
headless:false
});
const page = await browser.newPage();
await page.goto('https://www.dygod.net/');
//await page.screenshot({path: 'example.png'});
//eval,返回dom内容
var ans = await page.$$eval("a>img",function(data){
var arr = [];
data.forEach(function(item,i){
arr.push(item.src);
// console.dir(item.src);
})
return arr;
})
let page2 = await browser.newPage();
//console.log(ans)
await page2.goto(ans[1]);
//.$$只能返回dom的handle
var search = await page.$$('.searchl>p>input');
//console.log(eleHandles)
await search[0].focus();
await page.keyboard.type('香肠');
var btn = await page.$$('.searchr>input');
await btn[0].click();
//await page.goto(arr[1].currentSrc);
/* page.on('console',function(...rest){
console.log(rest);
}) */
//await browser.close();
})();
5.bagpipe
可以动态添加队列的多函数并行模块
6.heapdump
用于打印内存快照
7.mimi
8.assert
断言
const mime = require('mime');
console.log(mime.getType('asdasd.txt'))//text/plain
8.cluster
创建node进程集群
4.node函数规范
回调函数一般作为异步函数的最后一个参数出现:
function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }
回调函数的第一个参数为异常
5.Promise/Deferred模式
Deferred主要用于内部,用于维护异步模型的状态,Promise则用于外部,通过then方法暴露给外部以添加自定义逻辑。
6.buffer
var str = '深入浅出node.js';
//var buf = new Buffer(str,'utf-8')
//这种方式已经弃用
var buf = Buffer.from(str)
//var buf = new Buffer(10)
//这种方式已经弃用
var buf2 = Buffer.alloc(10);//大小为10的空buffer
console.log(buf,buf.length)
乱码的产生,由于buffer截取时没有截取到中文字符的完整三个字节,就会产生乱码
var fs = require('fs'); // 载入fs模块
var reader = fs.createReadStream('input.txt',{highWaterMark:11});
var writer = fs.createWriteStream('output.txt');
reader.on('data',function(chunk){
console.log(''+chunk)
})
//菜鸟教�
//�官网地�
//��:www.ru
//noob.com
reader.pipe(writer)
//解决办法:reader.setEncoding('utf-8')
//原理是每次data事件如果发现字节不完整就添加到下次data,这个工作由内部的decoder对象完成
//菜鸟教
//程官网地
//址:www.ru
//noob.com
//解决方法2
var buf = Buffer.concat(chunks);
console.log(buf)
console.log(buf.toString())
7.HTTP模块的请求对象与相应对象
ServerRequest用于读操作,ServerResponse用于写操作
8.node的特点
1.事件驱动
2.非阻塞io
node在现代开发的作用。
1.作为中间层,渲染html模板,对接后端。
2.作为项目构建的工具(webpack、vue-cli都是用node写的)
9.流读取
存在的意义是有些文件过大不适合放在内存中,因此不能一次读
10.axios gbk->utf-8
axios({
method: 'get',
url: httpUrl,
responseType: 'arraybuffer'
}).then(function(res){
console.log(iconv.decode(res.data, 'gbk'))
},function(err){
console.log(err)
})
11.文件名正则处理
.slice(0,12).replace(/[<>"\?\/\:&\|\\\*^%$#@\-]/g,"")
12.nodemon
自动重启服务器模块,启动时用nodemon代 替npm就行
13.既然有相对路径为什么要用__dirname和__filename
相对路径指的是相对node执行时的目录,因此如果要不执行当前目录下的脚本用相对路径肯定是有问题的。
而__dirname会强行指向当前文件目录的绝对路径,因此不在当前目录下执行脚本,脚本路径也不会出错。
扩展:对于requrie()加载模块的不会有影响