Browserify - 在无法在npm3中运行的符号链接模块上的package.json中进行转换

时间:2016-03-02 07:10:03

标签: javascript node.js npm browserify babeljs

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

尝试构建一个适用于npm@3babelify@7的应用,但升级到app/node_modulesnpm install时遇到问题。请允许我尝试解释这个问题。

  • npm link中,我通过package.json安装了模块,并通过 }, "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"中指定的浏览器变换,例如

babel-preset-es2015

尝试构建我收到错误:

node_modules

npm 3已经展平了依赖关系树,因此符号链接模块所需的app位于app node_modules。根据@substack here的解释和此示例{{3}},browserify应该从符号链接的模块向上走到 ~/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 并检查babel-preset-es2015那里,但它没有似乎这样做。

我的目录布局如下所示:

modules-shared

如果我在id level score 1 1 2 2 1 4 3 2 1 4 3 2 5 4 10 ....................... 文件夹中安装select * from table order by score desc group by level LIMIT 3 ,则browserify会找到预设。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

使用此变换realpathify可能会解决Browserify问题,但至于Babel的问题,我看不到任何解决方案的移动。