如何让node运行es6模块文件及其原理详解

2020-06-17 06:37:55易采站长站整理
require
机制进行
hook
,劫持
require
抓取的源文件代码,把源代码转码成
commonjs
规范之后,再传送给
require
机制原本的代码流中。

pirates 之类的第三方

npm
包提供了这种添加
hook
的功能。

babel-register 便是使用这种方式达到

node
运行
es6
模块文件的目的的。

2.1 使用 babel-register 直接运行

es6
模块文件

示例目录:


- package.json
- src/
- entry.js # 这里多了一个入口文件,专门用于注册 babel-register
- index.js
- print.js
- ...

相关文件:


# package.json
{
"scripts": {
"run": "node src/entry.js"
},
"devDependencies": {
"@babel/core": "^7.1.2",
"@babel/plugin-transform-modules-commonjs": "^7.2.0",
"@babel/register": "^7.0.0"
}
}

# src/entry.js # 入口文件必须使用 commonjs 规范来写,因为还没有注册 hook
require('@babel/register')({
plugins: ['@babel/plugin-transform-modules-commonjs']});
require('./index');

# src/index.js
import print from './print';

print('index');

# src/print.js
export default str => {
console.log('print: ' + str);
};

运行:


npm run run

结果:


# 命令行打印

print: index

这种方式因为中间转码会有额外的性能损耗,所以不建议在生产环境下使用,只建议在开发模式下使用。

2.2 使用babel-node 直接运行

es6
模块文件

babel-node 对 babel-register 进行了封装,提供了在命令行直接运行

es6
模块文件的便捷方式。

示例目录:


- package.json
- src/
- index.js
- print.js
- ...

相关文件:


# package.json
{
"scripts": {
"run": "babel-node src/index.js --plugins @babel/plugin-transform-modules-commonjs"
},
"devDependencies": {
"@babel/core": "^7.1.2",
"@babel/node": "^7.2.0",
"@babel/plugin-transform-modules-commonjs": "^7.2.0"
}
}

# src/index.js
import print from './print';