跳至主要内容

@babel/register

您可以通过 require 钩子使用 Babel。require 钩子会将自身绑定到 Node.js 的 require 并自动编译文件。这等效于 CoffeeScript 的 coffee-script/register

安装

npm install @babel/core @babel/register --save-dev

用法

JavaScript
require("@babel/register");

所有后续由 Node.js 使用扩展名 .es6.es.jsx.mjs.js 引用的文件都将由 Babel 进行转换。

不包含 Polyfill

当使用需要它的功能(如生成器)时,您必须单独包含 polyfill

默认情况下忽略 node_modules

注意:默认情况下,所有对 node_modules 的引用都将被忽略。您可以通过传递一个忽略正则表达式来覆盖它,方法是

JavaScript
require("@babel/register")({
// This will override `node_modules` ignoring - you can alternatively pass
// an array of strings to be explicitly matched or a regex / glob
ignore: [],
});

指定选项

JavaScript
require("@babel/register")({
// Array of ignore conditions, either a regex or a function. (Optional)
// File paths that match any condition are not compiled.
ignore: [
// When a file path matches this regex then it is **not** compiled
/regex/,

// The file's path is also passed to any ignore functions. It will
// **not** be compiled if `true` is returned.
function(filepath) {
return filepath !== "/path/to/es6-file.js";
},
],

// Array of accept conditions, either a regex or a function. (Optional)
// File paths that match all conditions are compiled.
only: [
// File paths that **don't** match this regex are not compiled
/my_es6_folder/,

// File paths that **do not** return true are not compiled
function(filepath) {
return filepath === "/path/to/es6-file.js";
},
],

// Setting this will remove the currently hooked extensions of `.es6`, `.es`, `.jsx`, `.mjs`
// and .js so you'll have to add them back if you want them to be used again.
extensions: [".es6", ".es", ".jsx", ".js", ".mjs"],

// Setting this to false will disable the cache.
cache: true,
});

您也可以传入所有其他 选项,包括 pluginspresets。请注意,配置文件 也将被加载,并且程序化配置将与文件配置选项合并。@babel/register 在配置文件中不支持 ignoreonly

环境变量

默认情况下,@babel/node CLI 和 @babel/register 会将缓存保存到您的临时目录中的 JSON 文件中。

这将大大提高文件的启动和编译速度。但是,在某些情况下,您可能希望更改此行为,并且可以使用环境变量来实现此目的。

BABEL_CACHE_PATH

指定不同的缓存位置。

Shell
BABEL_CACHE_PATH=/foo/my-cache.json babel-node script.js

BABEL_DISABLE_CACHE

禁用缓存。

Shell
BABEL_DISABLE_CACHE=1 babel-node script.js

动态编译插件和预设

@babel/register 使用 Node.js 的 require() 钩子系统在加载文件时动态编译它们。虽然这总体上很有帮助,但这意味着在 require() 钩子中的代码导致对 require 的更多调用,从而导致依赖循环的情况下,可能会出现混乱。例如,在 Babel 的情况下,这可能意味着在 Babel 尝试编译用户文件的过程中,Babel 可能会在加载时尝试编译自身。

为了避免这个问题,此模块明确禁止重入编译,例如,Babel 自己的编译逻辑明确不能触发动态编译任何其他文件。这样做的缺点是,如果您想定义一个本身是动态编译的插件或预设,则该过程会很复杂。

关键是您自己的代码需要先加载插件/预设。假设插件/预设预先加载了所有依赖项,那么您要做的就是

require("@babel/register")({
// ...
});

require("./my-plugin");

因为是您自己的代码触发了加载,而不是 @babel/register 本身内部的逻辑,所以这应该可以成功编译任何同步加载的插件/预设。

实验性 Babel 8 实现

您还可以使用以下命令测试将在 Babel 8 中默认启用的新的实验性实现:

JavaScript
require("@babel/register/experimental-worker");

它在内部异步运行 Babel,因此它与 .mjs 配置文件 兼容。您已经可以将它用作 @babel/register 的替代品,但有一些需要注意的地方

  • 如果您以编程方式指定 @babel/register 选项(使用 require("@babel/register")({ /* ... options */ })),则必须确保它们是可序列化的。这意味着您不能传递内联定义的插件函数,而必须将它们移动到单独的 ./my-plugin.js 文件或 babel.config.js 文件中。
  • 新的实现仍处于实验阶段:它应该具有与现有实现相同的功能,但可能会出现一些新的错误和回归。

注意:@babel/register 不支持动态编译原生 Node.js ES 模块,因为目前还没有稳定的 API 来拦截 ES 模块加载。