gpt4 book ai didi

node.js - 在我的 cli npm 应用程序中使用 babel-register 在本地工作,但在发布后不能全局使用

转载 作者:搜寻专家 更新时间:2023-10-31 22:37:15 25 4
gpt4 key购买 nike

我开发了一个 javascript CLI 应用程序,它使用 ES2015 代码和 babel 作为编译器。 (babel-require 钩子(Hook))

该应用程序在本地 完美运行,但是当我在 npm 上发布时,它停止运行(babel 似乎不再编译 ES2015 文件)

设置:

示例 ./bootstrap.js (ES5):

require('babel-register');
require('./src/app.js');

示例 ./src/app.js (ES2015):

import package from 'package';
...

示例 ./bin/myapp:

#!/usr/bin/env node
require('../bootstrap.js');

在本地运行有效:

appdir$ ./bin/myapp
I'm running fine!
appdir$

全局运行(在 npm 安装之后)中断:

$ sudo npm install -g myapp
└── myapp@0.1.0
$ myapp
/usr/local/lib/node_modules/myapp/src/app.js:1
(function (exports, require, module, __filename, __dirname) { import package from 'package';
^^^^^^

SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:404:25)
at Module._extensions..js (module.js:432:10)
at Object.require.extensions.(anonymous function) [as .js] (/usr/local/lib/node_modules/myapp/node_modules/babel-register/lib/node.js:138:7)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:313:12)
at Module.require (module.js:366:17)
at require (module.js:385:17)
at Object.<anonymous> (/usr/local/lib/node_modules/myapp/server.js:9:12)
at Module._compile (module.js:425:26)

版本:

    ├─┬ babel-register@6.4.3
│ │ ├─┬ babel-core@6.4.5
│ │ │ ├─┬ babel-code-frame@6.3.13
│ │ │ ├─┬ babel-generator@6.4.5
│ │ │ ├── babel-helpers@6.4.5
│ │ ├── babel-runtime@5.8.35

我尝试过的:

  • 在我的 .babelrc 文件中添加 ignore: false 希望它能够编译
  • 在 require 钩子(Hook)参数中使用选项而不是 .babelrc 文件

运气不好 :/

最佳答案

好的,我知道是什么问题了。我在正确的轨道上认为有一些东西禁止编译发生。

长话短说

babel-register 钩子(Hook)不接受 .babelrc 文件中的 ignoreonly 选项,但是它从它的论点做起。

./bootstrap.js 中的修复:

require('babel-register')({
ignore: [],
only: [/src/],
});
require('./src/app.js');
  • ignore 开关将禁止忽略路径中匹配 node_modules 的文件,每个 全局模块都是这种情况。
  • only 开关然后启用编译我的项目 src 目录中的文件。

现在,如果您有兴趣,我将描述我为解决该问题所采取的步骤,因为我认为我做对了(这次 :))...

故障排除的故事:

  • 首先,我需要安装node-debug命令行工具

    $ sudo npm install -g node-inspector
  • 然后用它启动我的应用程序(--debug-brk 开关要求在第一行停止执行)

    $ node-debug --debug-brk myapp
  • node-debug 提供的本地 URL 打开我的浏览器,然后看到我的应用程序代码

  • require('./scr/app.js'); 语句的正上方放置一个断点
  • 单击“播放”继续流程执行直到该行
  • 这里开始使用“跨过”和“步入内部”按钮攀爬错误跟踪的繁琐任务:当下一条语句位于错误跟踪的“外部”时(请参阅问题中的上面那个),我可以'跨过'。如果下一条语句是跟踪的函数之一,则“介入”。
  • 然后我意识到,通过查看“作用域变量” watch ,在 Object.require.extension 方法中,在文件 babel-register/lib/node.jsignoreonly 变量是 undefined,尽管我希望它们被定义!
  • 我进入了同一个文件的方法 shouldIgnore,这证实了我的担心:如果 !忽略 && !only 并在匹配时返回 true(忽略文件)。这最终导致我的 ES2015 文件无法编译。

    babel-register/lib/node.js:120:
    function shouldIgnore(filename) {
    if (!ignore && !only) { // here `ignore` and `only` were null, despite .babelrc values
    return getRelativePath(filename).split(_path2["default"].sep).indexOf("node_modules") >= 0;
    } else {
    return _babelCore.util.shouldIgnore(filename, ignore || [], only);
    }
    }
  • 然后我猜测我必须直接在 babe-register 参数中指定这些开关。

关于node.js - 在我的 cli npm 应用程序中使用 babel-register 在本地工作,但在发布后不能全局使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35120305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com