JavaScript Dev Toolkit
Table of Contents
1. Node
Node.js 是基于 Google V8 引擎的服务端 JavaScript 环境,
npm 是内置在 Node.js 中的一个 JavaScript 包管理工具。类似于 Perl 中的 CPAN。
1.1. npm 基本使用
1.1.1. package.json
在 nodejs 项目的根目录中一般有 package.json 文件,它定义了这个项目所需要的各种模块,以及项目的配置信息(如项目名称、版本、许可证等等)。
使用 npm init
可以生成 package.json 文件。
$ npm init # 以交互式的方式生成文件package.json
关于 package.json 的格式可参考 package.json 。
1.1.1.1. 指定依赖库的版本(^和~的区别)
npm 中版本格式采用 semantic versioning ,由 3 个用点号分开的数字组成:第 1 个数字为大版本号,第 2 个数字为小版本号,第 3 个数字为 patch 版本号。
当指定依赖库的版本时,经常看到在版本号前加上符号 ^
或者 ~
,它们的区别如下:
^
表示同一大版本号中,不小于指定版本号的版本号。 比如:^1.0.4
表示大版本号为 1,不小于 1.0.4 的版本号,如 1.0.4, 1.0.5, 1.1.0, 1.2.0 等等都是可以的,但 2.0.0 就不行了(因为大版本号变了)。~
表示同一大版本号和小版本号中,不小于指定版本号的版本号。 比如:~1.0.4
表示大版本号为 1,小版本号为 0,不小于 1.0.4 的版本号,如 1.0.4, 1.0.5 等等都是可以的,但 1.1.0 就不行了(因为小版本号变了),2.0.0 也不行(因为大版本号变了)。
1.1.2. 安装/卸载 package
使用 npm install <package name>
可以安装软件包,如:
$ npm install # 不指定软件包名字时,会安装当前目录中文件“package.json”中指定的所有依赖软件包 $ npm install <package name> # 默认会安装在当前目录 $ npm install <package name> --save # 默认会安装在当前目录,而且把软件包名字保存到“package.json”的dependencies节中 $ npm install -g <package name> # 安装包在全局位置 $ npm install --verbose <package name> # 安装软件时显示更详细信息
使用 npm uninstall <package name>
可以卸载软件包。
1.1.3. npm run
在 package.json 文件的 scripts 属性中可以指定一些想要执行的脚本,如:
{ ...... "scripts": { "myscript": "node myscript.js" } }
当我们运行 npm run myscript
时,会执行其对应的脚本 node myscript.js
。
1.1.4. 获取 npm 帮助信息
可用下面命令获取相关帮助文档:
$ npm help # 显示简要帮助信息 $ npm -l # 列出各个命令的使用说明 $ npm <cmd> -h # 显示命令 cmd 的帮助信息
1.1.5. 查询全局安装软件包
使用 npm list -g --depth=0
可以查询全局安装的软件包,如:
$ npm list -g --depth=0 /usr/local/lib ├── npm@6.4.1 └── typescript@3.6.2
1.2. npm 配置
1.2.1. npm 设置代理
可以用下面命令来设置代理。
$ npm config set proxy http://proxy.company.com:8080 $ npm config set https-proxy http://proxy.company.com:8080 # 注意:不是https_proxy
可以用下面命令查看当前设置:
$ npm config get proxy $ npm config get https-proxy # 注意:不是https_proxy
参考:https://jjasonclark.com/how-to-setup-node-behind-web-proxy
1.3. Bower
和 npm 类似,Bower 也是一个包管理工具。不过,Bower 往往用于前端项目,而不是后端 nodejs 项目。
用下面命令可以安装 Bower:
$ npm install -g bower
安装完 bower 后,可以用它安装其它包了。如:
$ bower install <package>
1.3.1. bower 设置代理
在文件~/.bowerrc 中可以设置代理。如:
$ cat ~/.bowerrc { "proxy":"http://<user>:<password>@<host>:<port>", "https-proxy":"http://<user>:<password>@<host>:<port>" }
1.4. yarn
yarn 是 Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具。正如官方文档中写的,Yarn 是为了弥补 npm 的下面缺陷:
1、npm 安装 packages 的速度不够快,拉取的 packages 可能版本不同,
2、npm 允许在安装 packages 时执行代码,这就埋下了安全隐患
Yarn 目前不是完全替代 npm,它只是一个新的 CLI 工具,拉取的 packages 依然来自 npm 仓库。
用下面命令可以安装 yarn:
$ npm install -g yarn
yarn 的基本命令如下:
$ yarn init # 创建新工程 $ yarn add [package] # 增加依赖 $ yarn upgrade [package] # 更新依赖 $ yarn remove [package] # 删除依赖 $ yarn install # 安装工程的所有依赖
1.5. nvm(管理不同版本 Node)
如果你需要在同一台机器上开发多个 Node 项目,并且不同项目对 Node 版本的要求不一样。这时你可以需要来回在不同版本的 Node 之间切换。推荐使用 nvm 来管理不同版本的 Node。
下面是 nvm 的基本用法:
$ nvm install v12.22.1 # 安装指定版本的 Node $ nvm install v16.3.0 # 安装指定版本的 Node $ nvm use v12.22.1 # 切换指定版本的 Node $ nvm use v16.3.0 # 切换指定版本的 Node
执行下面命令可以安装 nvm(这里是版本 v0.40.0,其最新版本可以在 https://github.com/nvm-sh/nvm 在找到。注:不要使用 Node 中的 npm 安装 nvm;而要使用 nvm 安装 Node):
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
在 .bashrc 或者 .zprofile 等文件中增加下面三行:
# 不过,下面 This loads nvm 这一行代码执行非常慢 # 所以不建议直接写入 .bashrc 或者 .zprofile 中,而是使用后面介绍的 workaround export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
不过,其中第二行代码执行很慢!会严重拖累新 Shell 的启动速度,下面懒加载的 workaround 可以解决执行慢的问题:
lazy_load_nvm() { unset -f npm node nvm export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion } npm() { lazy_load_nvm npm $@ } node() { lazy_load_nvm node $@ } nvm() { lazy_load_nvm nvm $@ }
参考:https://github.com/nvm-sh/nvm/issues/2724#issuecomment-1336537635
2. Grunt
Grunt 是一个 Javascript Task Runner(Javascript 任务运行器),可用于自动化构建、测试、生成文档的项目管理工具。
$ npm install -g grunt-cli $ npm install -g grunt
3. Yeoman
Yeoman 是一个脚手架工具,可以方便的为你产生一个初始项目,标准的文件夹布局,标准的包依赖,初始的页面例子。Yeoman 提供一些 generators,用来生成不同的项目。
$ npm install -g yo
4. ESLint
ESLint 是 JavsScript 静态分析工具,可以发现 JavsScript 代码中潜在的问题。类似的工具还有JSLint ,JSHint。
$ npm install -g eslint # 安装ESLint $ eslint --init # 第一次运行ESLint时,需要先运行 eslint --init 来生成配置文件 $ eslint yourfile.js # 使用ESLint分析文件yourfile.js
ESLint 支持的配置文件格式有很多,比如“.eslintrc.yaml”(YAML 格式)或者“.eslintrc.json”(JSON 格式)等等。
下面是文件“.eslintrc.json”的一个例子:
{ "env": { "browser": true, }, "extends": "eslint:recommended", "globals": { "$": true }, "rules": { "linebreak-style": [ "error", "unix" ], "semi": [ "error", "always" ], "no-unused-vars": [ "error", { "vars": "local" } ] } }
配置规则时,可以使用"off"来禁止它,或者"warn"/"error"来打开它,具体含义如下:
"off"
or 0 - turn the rule off
"warn"
or 1 - turn the rule on as a warning (doesn’t affect exit code)
"error"
or 2 - turn the rule on as an error (exit code will be 1)
5. js-beautify(代码格式化工具)
js-beautify 是一个代码格式化工具,它不仅支持格式化 JavaScript,还格式化 css 和 html 代码。
js-beautify 安装:
$ npm -g install js-beautify # 安装
js-beautify 使用:
$ js-beautify -r foo.js # -r 表示replace,即直接修改原文件 $ css-beautify -r foo.css # 相当于 js-beautify --css foo.css $ html-beautify -r foo.html # 相当于 js-beautify --html foo.html
js-beautify 配置:可以使用文件“.jsbeautifyrc”对 js-beautify 进行设置。下面是“.jsbeautifyrc”的一个例子:
{ "indent_size": 4, "html": { "end_with_newline": true, "js": { "indent_size": 2 }, "css": { "indent_size": 2 } }, "css": { "indent_size": 1 }, "js": { "preserve-newlines": true } }
注:文件“.jsbeautifyrc”可以放到当前目录( $PWD
)到根目录的任何一个目录中。
6. mocha(代码测试工具)
mocha 是流行的 JavaScript 测试框架之一,在浏览器和 Node 环境都可以使用。
假设 add.js 内容为:
// add.js function add(x, y) { return x + y; } module.exports = add;
下面是测试代码(假设文件名为 add.test.js):
// add.test.js var add = require('./add.js'); var expect = require('chai').expect; describe('加法函数的测试', function() { it('1 加 1 应该等于 2', function() { expect(add(1, 1)).to.be.equal(2); }); it('1 加 -1 应该等于 0', function() { expect(add(1, -1)).to.be.equal(0); }); });
下面是使用 mocha
运行上面测试代码的输出:
$ mocha add.test.js 加法函数的测试 ✓ 1 加 1 应该等于 2 ✓ 1 加 -1 应该等于 0 2 passing (9ms)
7. Babel(代码转换工具)
Babel 是一个 JavaScript 转码器,可以将 ES6 代码转为 ES5 代码,这样你不用担心新语法在当前环境中不被支持。
8. pm2(Node 进程管理器)
pm2 是一个 Node 进程管理器,它有下面一些功能:
- 负载均衡
- 应用 crash 后自动重启
- 日志管理
- 等等
下面是使用 pm2 list
查看当前系统中 pm2 所管理的 Node 进程的例子:
$ pm2 list ┌──────────┬────┬──────┬─────┬────────┬───────────┬────────┬─────────────┬──────────┐ │ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │ ├──────────┼────┼──────┼─────┼────────┼───────────┼────────┼─────────────┼──────────┤ │ myApp │ 0 │ fork │ 931 │ online │ 1 │ 5s │ 123.139 MB │ disabled │ └──────────┴────┴──────┴─────┴────────┴───────────┴────────┴─────────────┴──────────┘ Use `pm2 info <id|name>` to get more details about an app
9. forever(可以代替 pm2)
forever 也是一个 Node 进程管理器,可以代替 pm2。
下面是使用 forever list
查看当前系统中 forever 所管理的 Node 进程的例子:
$ npx forever list info: Forever processes running data: uid command script forever pid id logfile uptime data: [0] hYBT /home/user1/app/node-v14.17.5-linux-x64/bin/node index.js 1278317 1278324 /home/user1/.forever/log.txt STOPPED data: [1] 6pde /home/user1/app/node-v14.17.5-linux-x64/bin/node index.js 1278629 1278636 /home/user1/.forever/log.txt STOPPED data: [2] 1UEI /home/user1/app/node-v14.17.5-linux-x64/bin/node index.js 1278895 1278902 /home/user1/.forever/log.txt STOPPED
10. Webpack(模块打包工具,可以代替 RequireJS)
Webpack 是一个模块打包工具,它根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。
有了 Webpack,引入模块时我们不用关心模块的依赖关系,它把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack 将从这个文件开始找到你的项目的所有依赖文件,最后打包为一个(或多个)浏览器可识别的 JavaScript 文件,如图 1 所示。
Figure 1: Then run webpack on the command-line to create bundle.js
Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。比如我们需要在应用中打包 css 文件,就需要使用到 css-loader 和 style-loader。