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 , 这里的指的是一个命令行工具装在全局中