【问题标题】:Browserify - transform in package.json on symlinked modules not working in npm3Browserify - 在 package.json 中转换符号链接模块在 npm3 中不起作用
【发布时间】:2016-03-02 07:10:03
【问题描述】:

环境: node@5.70 npm@3.75 browserify@13.0.0 babelify@7.2.0

尝试构建与 npm@2babelify@6 一起使用的应用,但在升级到 npm@3babelify@7 时遇到问题。请允许我尝试解释问题。

  • app/node_modules 中,我通过npm install 安装了模块,并通过npm link 符号链接了本地模块。

  • 本地模块在其package.json 中指定了 browserify 转换,例如 -

}, "devDependencies": { "babel-preset-es2015": "^6.5.0", "babelify": "^7.2.0" }, "browserify": { "transform": [ [ "babelify", { "presets": [ "es2015" ] } ] ] }

尝试构建我得到错误:

"Browserify Error: Couldn't find preset "es2015" relative to directory"

npm 3 已经扁平化了依赖树,所以符号链接模块需要的 babel-preset-es2015appnode_modules 中。根据@substack here 的解释和这个例子here browserify 应该从符号链接模块向上走树到app 并在那里签入node_modules,但它似乎没有这样做。

我的目录布局如下:

~/projects |-- app |-- entry.js (this file can see babel-preset just fine) |-- node_modules |-- babel-preset-es2015 |-- my-module (symlink pointing at ~/projects/modules-shared/my-module) |-- index.js (we want babelify to transform this file) |-- modules-shared |-- my-module

如果我在modules-shared 文件夹中安装babel-preset-es2015,browserify 会找到预设。

【问题讨论】:

  • 您的问题解决了吗?

标签: javascript node.js npm browserify babeljs


【解决方案1】:

回到这个我有些忽略的问题。这个问题很难解决,因为它与所用工具的两个不同特性有关。

首先,Browserify 没有按应有的方式处理符号链接。它没有将符号链接的 npm 模块视为处于其符号链接位置,而是占据其在文件系统中的实际位置,因此无法在 npm3 的平面文件树下找到其依赖项。

其次,Babel 要求其依赖项位于相关模块的 node_modules 中,这实际上是对 npm2 嵌套文件树系统的硬依赖。

因此,出于相同的原因,我们遇到了两个不同的问题 - npm3 改变了 node_modules 的组织方式。

我能找到的最好的解决方法是编写一个只安装任何符号链接模块的 babel 依赖项的自定义脚本。您可能认为只安装符号链接模块的所有依赖项是个好主意,但这会导致 Browserified 包中的重复实例,从而导致各种微妙的、难以理解的错误。

Browserify 问题可能可以通过这个转换realpathify 解决,但至于 Babel 的问题,我看不到任何解决方案的进展。

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2017-03-21
    • 1970-01-01
    • 2018-07-16
    • 2017-10-16
    • 2013-06-26
    • 2018-06-06
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多