一、Node介绍
- (1)定义:Node让javascript在服务器跑。在chrome's v8上的javasctipt运行时。
- (2)特点:事件驱动(I/O等异步操作结束后的通知,观察者模式)、非阻塞I/O模型。
- (3)web常见场景:
- 静态资源读取、数据库操作、渲染页面
- 高并发应对之道:增加机器数、增加每台机器的CPU数——多核
- nodejs单进程:单进程只是针对主进程,I/O操作系统底层多线程调度。
- 针对web服务器,高并发,I/O密集才性能高。对CPU密集则不能比java、c++性能高。
- 常见场景:web server、本地代码构建、 实用工具开发。
二、调试和项目初始化
- 使用vscode的debug工具进行调试
三、基础API
- 1、commonjs
- node.js模块管理规范 可参考nodejs.org/en/docs/gui…对node.js进行调试。 比如:node --inspect-brk test.js 对js进行调试并打断点
- 每个文件是一个模块,有自己的作用域
- 在模块内部module变量代表模块本身
- module.exports 属性代表模块对外接口
- require规则: /表示绝对路径。 ./表示相对当前文件。支持js.json.node,不写依次尝试
- 不写路径则认为是build-in 模块或者各级node_modules内的第三方模块。
- require特性:module 被加载的时候执行,被加载后缓存;一旦一个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出。(写代码时一定要避免模块循环加载)
- 1个node.js的基本模块
(function (exports, require, module, __filename, __dirname) {
XXX // 自己写的内容。
});
- exports和module.exports的区别
const exports = module.exports. // 即exports是module.exports的快捷方式。但是不能修改exports的指向。
- 2、global全局对象
CommonJs
,Buffer
,process
,console
,timer
在模块中直接写的变量是局部变量,。前面用global的话就变成全局变量。 example:
const testVar = 1000;
global.testVar2 = 200;
module.exports.testVar = testVar;
-
3、 process 对象
- argv, 1个数组,第一项为node进程,第二项为当前路径。其他的为命令传入的参数
- argv0, argv0就是argv的第一项,即node进程
- execArgv, 调用node传入的特殊参数
- execPath 调用脚本的路径
- env 就是所有的环境变量
- process.cwd() 当前路径
- 变量执行顺序:
- (1)process.nextTick最快,setTimeout第二,setImmediate最慢。process.nextTick是一定会在异步I/O之前执行。
-
4、Debug 调试
- Inspector
- vscode里的调试工具
-
5、 path 和路径相关的一切
- nodejs.cn中文官网
- __dirname,__filename 总是返回文件的绝对路径
- process.cwd()返回执行node命令所在的文件
- ./ 在require中都是相对当前文件所在文件夹,即绝对路径
- 在其他地方和process.cwd()一样,相对node启动文件夹
-
6、 Buffer在global对象上
- buffer处理二进制数据流
- 实例类似整数数组,大小固定
- c++ 代码在V8堆外分配物理内存
四、简单Web Server
- 1、.gitignore主要是代码不上传到git上保存,主要的匹配原则有以下:
- git-scm.com/docs/gitign…
- 匹配模式前
/
代表项目根目录 - 匹配模式最后加
/
代表是目录,匹配这里整个目录,匹配整个目录下的所有文件可以用/foo/*
- 匹配模式前加
!
代表取反,即不匹配这个文件 *
代表任意个字符,**代表多级目录,比如:node_modules/**/index.js
代表忽略掉node_modules下的任意级的index.js?
匹配任意一个字符**
匹配多级目录
- 2、.npmignore 主要是不需要发到npm中给别人去下载和执行的目录。
- 详情看规则docs.npmjs.com/misc/develo…
- 以下是一定会被忽略的文件
- .*.swp
- ._*
- .DS_Store
- .git
- .hg
- .npmrc
- .lock-wscript
- .svn
- .wafpickle-*
- config.gypi
- CVS
- npm-debug.log
- 以下是不被忽略的文件
- package.json
- README
- CHANGELOG
- LICENSE / LICENCE
- 3、.editorconfig 帮助开发者定义和保持一致的开发风格,在不同的编辑器和ide之间。
- 规则介绍editorconfig.org/
- 匹配规则示例说明
# 这个配置代表这个就是根目录,不需要再往上找
root = true
# 所有的文件都要匹配
[*]
# 用unix风格的回车
end_of_line = lf
# 文件的最后一行应该有一个回车
insert_final_newline = true
# 所有js文件或者py文件
[*.{js, py}]
# 用什么样的编码集
charset = utf-8
# 用space空格,4个缩进,所有py文件
[*.py]
indent_style = space
indent_size = 4
# Makefile文件使用tab键进行缩进
[Makefile]
indent_style = tab
# lib下的任意文件夹下的js文件,使用space键,2个空格
[lib/**.js]
indent_style = space
indent_size = 2
# 只对package.json,.travis.yml文件。使用space键,2个空格
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2
- 匹配规则
* 代表匹配任意1个字符,不代表文件
** 代表匹配任意多个字符,文件夹也会一起匹配
? 任意一个字符
[name] 只匹配里面的名字
[!name] 不匹配里面的名字,其他的都匹配
{s1,s2,s3} 里面的3个都可以
{num1..num2} num1到num2之间的都匹配
- 支持的属性
indent_style: 缩进的风格,可选`tab`或者`space`
indent_size: 缩进的格数
tab_width: tab的宽度
end_of_line: 以什么结尾,lf换行,cr当前行,crlf结尾行
charset: 编码格式。utf-8,latin1,utf-8-bom,utf-16be,utf-16le
trim_trailing_whitespace: 结尾默认帮你把空格或者空白符都去掉
insert_final_newline:要不要在最后一行增加一行
root: 是不是根目录
- 4、.eslintignore
- 规则文档:eslint.cn/docs/about/
- 配置文件:eslint.cn/docs/user-g…
/* eslint-disable */
使下面的代码不走eslint规则/* eslint-enable */
使下面的代码走eslint规则/* eslint-disable no-console, no-alert */
对指定的规则的eslint限制去掉/* eslint-disable */
全部的文件都不开启eslint// eslint-disable-line
只对某一行的eslint规则去掉// eslint-disable-next-line
只对接下来的这一行的eslint规则去掉- 生成eslint文件: eslint --init
- pre-commit插件可以在提交commit之前先帮你检测
- supervisor 可以控制进程,不用经常重启node
- handlebars 模板语法
- 5、命令行开发工具:www.npmjs.com/package/yar…
- 实现 anydoor -d或者-v去调用
五、构建工具
- gulp 本地构建
- glob
-
- 匹配任意个字符
- ?匹配1个字符
- [...]匹配范围内字符
- !(pattern1|pattern2) 匹配取反
- ?(pattern1|pattern2) 匹配0或1个
- +(pattern1|pattern2) 匹配1或多个
- *(a|b|c) 匹配任意个
- @(pattern|pat*|pat?erN) 匹配特定的一个
- ** 任意层级匹配
- babel
- presets 插件,可以编译es2015及之后的
- plugin 可以编译preset之外的,是对presets的补充
- es2015-modules-amd
- es2015-modules-commonjs
- es2015-module-systemjs
- es2015-modules-umd
- webpack module bundler
- loader 帮我们解析各种各样的文件类型
- externals,将一些全局变量转化成统一的引入
- vendor: 将一些非逻辑性又必须引入的。放在vendor中独立出来
- Tree-Shaking: 只用其中部分功能,就转部分的,不转全部的。
- plugins: 使用plugins做额外的一些东西
六、自动化测试
七、nodejs爬虫示例
- 爬虫:按照一定的规则自动抓取网络信息的程序
- 反爬虫:技巧:user-agent,referer,验证码,单位时间访问次数、访问量,关键信息图片混淆,异步加载
- 技术:
- cheerio,使用cheerio进行爬虫,并解析,如:time-craeler,但是不能绕过反爬虫
- puppeteer
八、nodejs关键技术
- Stream
- 动态web framework
- child_process & cluster
九、深入学习
- through2
- express、koa、egg
- SSR & 同构
- nodejs源码