第三方工具库

Node.js/NPM 管理

nvm 管理 Node.js 版本

nvmopen in new window,即 Node Version Manager,可以管理多个 Node.js 版本。

# 下载、编译、安装最新的 Node 的 release 版本,其中 node 是最新版本的别名
nvm install node

# 安装指定版本的 Node
nvm install 6.14.4

# 列出(远程)所有可用的版本
nvm ls-remote

# 列出本地安装的所有版本
nvm ls

# 使用特定版本
nvm use xxx

# 设置默认的 Node 版本
nvm alias default vxx.yy.zz
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

nrm 管理 NPM registry

nrmopen in new window,即 NPM registry manager,可以在各个 register 之间快速切换,比如npmcnpmtaobao

➜  ~ nrm ls

  npm ---- https://registry.npmjs.org/
  cnpm --- http://r.cnpmjs.org/
  taobao - https://registry.npm.taobao.org/
  nj ----- https://registry.nodejitsu.com/
  rednpm - http://registry.mirror.cqupt.edu.cn/
  npmMirror  https://skimdb.npmjs.com/registry/
  edunpm - http://registry.enpmjs.org/
* ks ----- https://npm.corp.kuaishou.com/
1
2
3
4
5
6
7
8
9
10

npx 调用局部安装的模块

npx,主要解决调用项目局部安装的模块的问题。正常项目局部安装的模块比如vuepress,只能在项目脚本和package.jsonscripts字段里面才能调用命令vuepress dev,若是想在命令行下调用,就必须像这样:

# 项目的根目录下执行
$ node-modules/.bin/vuepress dev
1
2

npx就是方便直接调用项目内部安装的模块:

npx vuepress dev
1

npx的原理很简单,就是运行的时候,会到node_modules/.bin路径和环境变量$PATH里面,检查命令是否存在。

由于npx会检查环境变量$PATH,所以系统命令也可以调用。

# 等同于 ls
$ npx ls
1
2

Reference:

cross-env 跨平台设置环境变量

windowsPOSIX命令行使用环境变量的方式是有差异的,对于POSIX,是使用$ENV_VAR;对于windows,则使用%ENV_VAR%

cross-env解决了跨平台设置和使用环境变量的问题,你只需要像在使用POSIX系统时那样设置就行,cross-env将帮你解决跨平台的问题。

# 安装
npm install --save-dev cross-env
1
2
// package.json
{
  "scripts": {
    "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js"
  }
}
1
2
3
4
5
6

监控文件变化

chokidar 监控文件变化

chokidaropen in new window,基于 Nodej.js 的fs.watch/fs.watchFile/fsevents封装的watch工具。

nodemon 监控文件变化重启应用

nodemonopen in new window可以在开发node.js应用时,监控目录下的文件改变,并自动重启node.js应用。

nodemon不需要任何关于开发方法或代码上的修改,它是node的封装,并代替了node。使用nodemon时,当执行脚本时,在命令行将原来的node替换成nodemon即可。

# 全局/局部安装
npm install -g nodemon
npm install --save-dev nodemon

# 启动应用,并默认监控当前工作目录下的文件改变(递归地)
nodemon ./server.js

# 启动应用,并监控 server 文件夹下的文件改变
nodemon server/index.js --watch server
1
2
3
4
5
6
7
8
9
// 方式二:该方式官网里直接说明结果的结构,因此如下阐述
var libs = require('require-all')(__dirname + '/lib');
1
2

假设lib目录下的文件夹结构为:

  • lib
    • folder1
      • file1-1.js
      • file1-2.js
    • folder2
      • file2-1.js

则通过方式二得到的libs为:

{
  folder1: {
    file1-1: [Function: exports],
    file1-2: [Function: exports]
  },
  folder2: {
    file2-1: [Function: exports]
  }
}
1
2
3
4
5
6
7
8
9

各个文件的结构为module.exports = function() {},以[Function: exports]表示。

网络请求

axios-curlirize 将请求显示为 CURL

axios-curlirizeopen in new window,将 Node.js 里的axios请求以 CURL 的形式打印出来。

koa 相关

koa2-connect

koa2-connectopen in new window,在 Koa v2 里使用 Express/Connect 的中间件。

koa-send、koa-static

koa-sendopen in new window,静态文件服务中间件。其核心实现方式是以fs.createReadStream读取服务器本地文件返回给客户端。

koa-staticopen in new window,Koa 的静态文件服务中间,基于koa-send封装。

koa-socket-2

koa-socket-2open in new window,Koa 里使用socket.io的语法糖。

koa-json

koa-jsonopen in new window,将请求的响应结果(ctx.body)按 JSON 格式美化的中间件,还支持将 Node 流对象转换为二进制。

koa-onerror

koa-onerroropen in new window,Koa 的错误处理,非中间件,可以在发生错误时根据请求的类型(比如html/json/text)返回该类型的响应。该插件通过修改ctx的原型app.context上的onerror方法给所有的ctx实例重新设置onerror方法。

app.context.onerror = function () {
  // ...
}
1
2
3

注意,Koa 的app.context上默认存在onerror方法,该插件覆盖了默认的onerror方法。

koa-bodyparser

koa-bodyparseropen in new window,Koa 的 body 解析中间件,解析后的数据存储在ctx.request.body里。

koa-router

koa-routeropen in new window

koa-views

koa-viewsopen in new window,模板渲染中间件,给定要请求的视图名称,传入数据,即可渲染出最终的模板字符串。

const path = require('path');
const views = require('koa-views');
const Koa = require('koa');
const app = module.exports = new Koa();

// 必须在任何路由中间件之前使用
app.use(views(
  // 模板目录,必须是绝对路径,所有的视图都是基于此路径
  path.join(__dirname, '/views'),
  {
    // 视图的默认扩展名
    extension: 'ejs'
  }
));

const user = {
  name: {
    first: 'Tobi',
    last: 'Holowaychuk'
  },
  species: 'ferret',
  age: 3
};

app.use(async function(ctx) {
  // 渲染 user 视图,默认扩展名是 ejs,参数是 { user }
  await ctx.render('user', { user });
});

if (!module.parent) app.listen(3000);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!-- user.ejs -->
<p><%= user.name.first %> is a <%= user.age %> year old <%= user.species %>.</p>
1
2

koa-proxy

koa-proxyopen in new window,是koa的代理中间件,主要是将请求代理到其他服务器上。

koa-logger

koa-loggeropen in new windowkoa开发风格的日志中间件。这个中间件应该尽可能靠前放置,以便可以记录下所有的请求和响应。

library 里常用的工具库

Inquirer.js

Inquirer.jsopen in new window,常用的交互式命令行 UI 集合,主要用于在命令行里让用户以交互式的方式选择/输入所需的数据。

Commander.js

Commander.jsopen in new window,完整的 Node.js 命令行解决方案,定义命令、选项,根据用户输入的命令执行操作。使用该库,可以定义一套命令及对应的功能。

其他

require-all

require-allopen in new windowrequire整个目录里的所有文件。

// 方式一:该方式可直接看官网示例,有详细说明
var controllers = require('require-all')({
  dirname     :  __dirname + '/controllers',
  filter      :  /(.+Controller)\.js$/,
  excludeDirs :  /^\.(git|svn)$/,
  recursive   : true
});
1
2
3
4
5
6
7

etag

etagopen in new window,创建简单的 ETags。

depcheck

depcheckopen in new window ,分析项目里的依赖,查看每个依赖是否使用到,缺少哪些依赖。