node.js入门到企业web开发中的应用

801 阅读6分钟

一、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之间。
# 这个配置代表这个就是根目录,不需要再往上找
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源码