node 介 绍
node.js 的一些 '是' 与 '不是'
- 不是一个框架, 库
- 不是一门新的语言
- 是一个平台
- 是一个 JS 的运行环境(浏览器也是 JS 的运行环境)
-
运行在 Chrome 的 V8 引擎中, 性能很高
- 并不在浏览器沙箱中运行
- 功能上类似C/C++
- 能访问电脑上的资源(文件,网络等)
node.js 现阶段应用场景
-
高性能 web 服务器
- 单线程异步实现
- 其他语言 Java / Python / NGINX
-
前端构建/前端工程化(搭环境)
- 转义( es6 -> es5, less/sass -> css)
- 压缩, 混淆(把易读的源代码转化成几乎不可读的, 最主要的手段就是通过改变形参的名字)
- 打包(把从入口文件开始的所有使用到的文件打包成一个文件)
- 爬虫, 命令行工具等
-
Electron (VScode, Atom)
- 由于没有 UI 框架, node 和浏览器结合, 利用浏览器窗口实现用户界面(VScode)
背 景
-
常见的 输入-输出 模型
-
同步I/O
当文件读取完全结束时返回内容-
传统方式
一个文件完全读取执行完成后, 再读取下一个for(var i = 0; i < 10; i++) { var content = readFile(i + '.txt') }
-
优化方式(C/C++)
所有文件同时读取, 哪个先读取完, 哪个先执行
select 函数是系统自带的一个函数, 会在所传入参数数组中的任何一个元素准备好时进行返回var conn1 = connect() var conn2 = connect() var conn3 = connect() while(true){ var readyConns = select([conn1, conn2, conn3]) for(var readyConn of readyConns) { var data = read(readyConn) var result = process(data) Write(readyConn, result) } }
- 多线程
多个文件在多个线程中进行
-
-
异步I/O(node.js)
脚本在读写设备的同时继续执行, 并在任务完成时调用回调函数
实际上是通过多个线程实现的, 只不过多线程相对隐藏, 只能够应用相应接口进行调用fs.readFile('a.txt', (err, data) => { }) console.log(1)
-
- 同步/异步
同步模式中含有隐藏的等待I/O, 适用于直线控制流程序
异步模式中的等待I/O在管控之中, 适用于非直线控制模型
node 版本号相关
- 每年4月和每年10月发布一个大的版本号(11.x.x->12.x.x)
- 奇数版本维护的时间相对较短(在下一个偶数号版本发布后完全停止维护)
- 在新的偶数号版本发布后, 前一个偶数号版本会成为LTS(Long Term Service)版本,并继续维护1.5年
- LTS版本非常稳定(API几乎不会发生变化), 并会修复漏洞
node 命令
-
执行JS文件
$ node hello.js(文件名)
-
交互式控制台(REPL)
$ node > 1 + 1 2 > .help // 一些常见帮助信息(break/clear/editor/exit/load/save) $
-
命令行参数
process.argv可以获取传递给脚本的命令行参数
showargv.js中只包含一条console.log(process.argv)语句$ node showargv.js one --and two ["node", "/home/margin/showargv.js", "one", "--and", "two"]
-
调试
-
在浏览器中调试
$ node --inspect-brk hello.js
运行完命令,打开Chrome的控制台点击node图标即可
brk使命令暂停在第一行,可不加 - 在VScode中直接调试
- ndb
-
模 块
node并没有在全局作用域中添加很多功能, 多数功能都是通过调用 require 函数从模块中获取的
从路径为 y 的模块中 require(x)
- 如果 x 是一个内置模块
-> 直接返回内置模块
-> 结束 - 如果 x 以'/'开头
-> 将 y 设置为根目录 - 如果 x 以 './' 或 '../' 或 '/' 开头
-> 加载 y + x 组合的路径 -
如果 x 看起来不像一个路径
-
在当前文件夹的 node-modules 文件夹里查找名为 x 的文件夹
- 如果此文件夹里有 package.json , 则加载 main 字段所指向的文件
- 如果没有 package.json , 则直接加载文件夹里的 index 文件
-
如果在当前文件夹的 node-modules 里找不到名为 x 的文件夹
- 则在当前文件夹的父级文件夹里查找 node-modules
- 如果 x 为 xx/yy 则加载 xx 文件夹中的 yy 文件
chunk1 = require('lodash').chunk // 加载了整个 lodash , 只把 chunk 读取了出来 chunk2 = require('lodash/chunk') // 只加载了 lodash 中的 chunk.js 文件
-
安装 NPM 模块
$ npm install figlet
$ npm i figlet//install和global可以缩写
$ npm i -g figlet
- npm install : 把文件下载下来, 装到当前工作目录的node-modules文件夹里面
- npm install --global : 全局安装, 注意全局安装并不是在所有地方都可以 require, 只能在当前文件夹中 require , 这里的指的是一个命令行工具装在全局中
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。