Node.js

[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

上一篇下一篇

猜你喜欢

热点阅读