@babel/register
您可以通过 require 钩子使用 Babel。require 钩子会将自身绑定到 Node.js 的 require
并自动编译文件。这等效于 CoffeeScript 的 coffee-script/register。
安装
- npm
- Yarn
- pnpm
npm install @babel/core @babel/register --save-dev
yarn add @babel/core @babel/register --dev
pnpm add @babel/core @babel/register --save-dev
用法
require("@babel/register");
所有后续由 Node.js 使用扩展名 .es6
、.es
、.jsx
、.mjs
和 .js
引用的文件都将由 Babel 进行转换。
当使用需要它的功能(如生成器)时,您必须单独包含 polyfill。
默认情况下忽略 node_modules
注意:默认情况下,所有对 node_modules
的引用都将被忽略。您可以通过传递一个忽略正则表达式来覆盖它,方法是
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: [],
});
指定选项
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,
});
您也可以传入所有其他 选项,包括 plugins
和 presets
。请注意,配置文件 也将被加载,并且程序化配置将与文件配置选项合并。@babel/register
在配置文件中不支持 ignore
和 only
。
环境变量
默认情况下,@babel/node
CLI 和 @babel/register
会将缓存保存到您的临时目录中的 JSON 文件中。
这将大大提高文件的启动和编译速度。但是,在某些情况下,您可能希望更改此行为,并且可以使用环境变量来实现此目的。
BABEL_CACHE_PATH
指定不同的缓存位置。
BABEL_CACHE_PATH=/foo/my-cache.json babel-node script.js
BABEL_DISABLE_CACHE
禁用缓存。
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 中默认启用的新的实验性实现:
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 模块加载。