[Node.js] 使用babel让模块兼容node 4
2019-03-29 本文已影响1人
何幻
1. 背景
Node.js LTS(Long Time Support) 的第一个版本是 4.2.0,
我们可以用 nvm 查看下,
$ nvm ls-remote --lts
-> v4.2.0 (LTS: Argon)
v4.2.1 (LTS: Argon)
v4.2.2 (LTS: Argon)
...
虽然目前已经发布了很多Node.js版本了,但是还是有一些在用Node 4.2.0,
不幸的是,Node 4.2.0 甚至不支持非严格模式下使用 let
。
(1)新建一个 index.js 文件
let a = 1;
(2)使用 nvm 将 Node 切换到 4.2.0
$ nvm install 4.2.0
Downloading and installing node v4.2.0...
Downloading https://nodejs.org/dist/v4.2.0/node-v4.2.0-darwin-x64.tar.gz...
######################################################################## 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v4.2.0 (npm v2.14.7)
$ node --version
v4.2.0
(3)执行一下 index.js
$ node index.js
/Users/.../index.js:1
(function (exports, require, module, __filename, __dirname) { let a = 1;
^^^
SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:414:25)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:467:10)
at startup (node.js:134:18)
at node.js:961:3
因此,发布 npm 包的时候,如果目标用户使用了 Node 4.2.0,就会出问题,
需进行兼容性处理。
2. target node 4.2.0
为了实现兼容性,我们可以在发布模块之前,先进行一次 babel 转译,具体步骤如下。
2.1 先切换到工作用的 Node 版本
$ nvm use 10.15.0
Now using node v10.15.0 (npm v6.4.1)
$ node --version
v10.15.0
2.2 将 index.js 放到 src/ 目录中
目录结构如下,
.
├── package.json
└── src
└── index.js
2.3 修改 package.json
(1)向 package.json 中添加 babel 相关的 依赖 和 配置
{
...,
"babel": {
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "4.2.0"
}
}
]
]
},
"devDependencies": {
"@babel/cli": "^7.2.3",
"@babel/core": "^7.4.0",
"@babel/preset-env": "^7.4.2"
}
}
(2)向 package.json 中添加 npm scripts
{
...,
"scripts": {
...,
"build": "babel src -d dist -D"
},
...
}
其中,-d
是--out-dir
的简写,用于指定编译产物目录。
-D
是--copy-files
的简写,用于拷贝不可编译的文件,
例如 .json
文件,如果不拷贝过去,用相对路径引用时就出错了。
(3)修改 package.json 的 main 字段
{
...,
"main": "dist/index.js",
...
}
2.4 安装依赖,并执行构建
$ npm i
$ npm run build
目录结构如下,我们把 src/ 目录编译到了 dist/ 中。
.
├── dist
│ └── index.js
├── package.json
└── src
└── index.js
参考
Node.js
Node.js Release Working Group
nvm
babel configuration: package.json
npm scripts
npm-package.json: main