JavaScript Dev Toolkit

Table of Contents

1. Node

Node.js 是基于 Google V8 引擎的服务端 JavaScript 环境,
npm 是内置在 Node.js 中的一个 JavaScript 包管理工具。类似于 Perl 中的 CPAN。

1.1. npm 基本使用

npm 的参数格式为:

$ npm <command>

参考:
http://tobyho.com/2012/02/09/tour-of-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. ^ 表示同一大版本号中,不小于指定版本号的版本号。 比如: ^1.0.4 表示大版本号为 1,不小于 1.0.4 的版本号,如 1.0.4, 1.0.5, 1.1.0, 1.2.0 等等都是可以的,但 2.0.0 就不行了(因为大版本号变了)。
  2. ~ 表示同一大版本号和小版本号中,不小于指定版本号的版本号。 比如: ~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             # 安装工程的所有依赖

参考:https://yarnpkg.com/en/docs/usage

1.5. nvm(管理不同版本 Node)

如果你需要在同一台机器上开发多个 Node 项目,并且不同项目对 Node 版本的要求不一样。这时你可以需要来回在不同版本的 Node 之间切换。推荐使用 nvm 来管理不同版本的 Node。

安装 nvm(这里是版本 v0.35.2,其最新版本可以在 https://github.com/nvm-sh/nvm 在找到。注:不要使用 Node 中的 npm 安装 nvm;而要使用 nvm 安装 Node):

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash

在 .bashrc 或者 .zshrc 等文件中增加下面两行:

export NVM_DIR=${HOME}/.nvm
. $NVM_DIR/nvm.sh                   # This loads nvm

下面是 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 use 来指定使用的 Node 版本。下面介绍 zsh 中的解决方案: 在每个项目的根目录创建文件: .nvmrc ,其内容是项目所需要的 Node 版本号,比如 v12.22.1 或者 v16.3.0 。 *在 zsh 中定制 cd 的 Hook,每次执行 cd 命令自动根据 .nvmrc 中指定版本号来执行 nvm use

zsh 的 Hook 代码如下,需要写入到 .zshrc 文件中:

# place this after nvm initialization!
autoload -U add-zsh-hook

load-nvmrc() {
  local nvmrc_path
  nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version
    nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
      nvm use
    fi
  elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}

add-zsh-hook chpwd load-nvmrc
load-nvmrc

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 代码中潜在的问题。类似的工具还有JSLintJSHint

$ 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)

参考:http://eslint.org/

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 )到根目录的任何一个目录中。

参考:https://www.npmjs.com/package/js-beautify

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)

参考:测试框架 Mocha 实例教程

7. Babel(代码转换工具)

Babel 是一个 JavaScript 转码器,可以将 ES6 代码转为 ES5 代码,这样你不用担心新语法在当前环境中不被支持。

参考:https://babeljs.io/

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

参考:http://pm2.keymetrics.io/

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

参考:https://github.com/foreversd/forever

10. Webpack(模块打包工具,可以代替 RequireJS)

Webpack 是一个模块打包工具,它根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

有了 Webpack,引入模块时我们不用关心模块的依赖关系,它把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack 将从这个文件开始找到你的项目的所有依赖文件,最后打包为一个(或多个)浏览器可识别的 JavaScript 文件,如图 1 所示。

js_dev_webpack.png

Figure 1: Then run webpack on the command-line to create bundle.js

Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。比如我们需要在应用中打包 css 文件,就需要使用到 css-loader 和 style-loader。

参考:https://webpack.js.org/guides/getting-started

Author: cig01

Created: <2016-05-30 Mon>

Last updated: <2020-03-02 Mon>

Creator: Emacs 27.1 (Org mode 9.4)