本节咱们来讲一下 @babel/register。应用 Babel 的办法之一就是通过 require 钩子(hook),require 钩子将本身绑定到 node 的 require 模块上,并在运行时主动编译文件。这和 CoffeeScript 的 coffee-script/register 相似。
装置
@babel/register 只有一个性能,就是重写 node 的 require 办法。
装置命令如下所示:
npm install @babel/core @babel/register --save-dev
装置好后能够通过 require 援用,如下所示:
require("@babel/register");
@babel/register 在底层改写了 node 的 require 办法,在代码里引入 @babel/register 模块后,所有通过 require 引入并且以 .es6,.es,.jsx,.mjs,和 .js 为后缀名的模块都会被 Babel 转译。
默认疏忽 node_modules
默认状况下,所有对 node_modules 目录下的文件的 require 申请都将被疏忽。咱们能够通过以下形式传递一个用于匹配被疏忽文件的正则表达式来批改默认行为:
require("@babel/register")({ignore: [],
});
指定参数
require("@babel/register")({
ignore: [
/regex/,
function(filepath) {return filepath !== "/path/to/es6-file.js";},
],
only: [
/my_es6_folder/,
function(filepath) {return filepath === "/path/to/es6-file.js";}
],
extensions: [".es6", ".es", ".jsx", ".js", ".mjs"],
cache: true,
});
或者还能够传递其余的参数,例如 plugins 和 presets。须要留神的是,配置文件也将被加载,并且编程形式的配置也将被合并进来,放在这些配置项的顶部。
环境变量
默认状况下,@babel/node 命令行工具和 @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
即时编译插件和 preset
@babel/register 应用 Node 的 require() 钩子零碎(hook system)在加载文件时即时编译文件。尽管这在总体上很有帮忙,但这意味着 require() 钩子中的代码会导致更多的 require 调用,从而导致依赖循环的状况呈现。
以 Babel 为例,这可能意味着在 Babel 试图编译用户的文件的过程中,Babel 最终可能会在加载本人时尝试编译本人。
为了防止这个问题,这个模块明确的禁止从新进入编译,例如 Babel 本人的编译逻辑明确禁止触发进一步编译任何其余正在运行的文件。
这样做的毛病是如果咱们想定义一个插件或 preset,并且这个插件或 preset 自身是实时编译的,这个过程将会很简单。
上述问题的关键在于咱们本人的代码首先须要加载插件或 preset,假设插件或 preset 事后加载了其本身的所有依赖项,能够像上面这样做:
require("@babel/register")({// ...});
require("./my-plugin");
因为是由咱们本人代码触发的加载,而不是 @babel/register 本身的业务逻辑,这样能力胜利编译任何同步加载的插件或 preset。
链接:https://www.9xkd.com/