为什么要安装 Browserify 两次才能捆绑

Why is it necessary to install Browserify twice to bundle

我创建了一个新项目

npm install -g browserify

我使用 cmdline browserify app.js > bundle.js 进行了测试。酷

我想缩小所以我 npm install uglifyify --save-dev

我使用 cmdline browserify -g uglifyify app.js > bundle.js 进行了测试。太好了。

现在我想用代码来做到这一点,但我得到 Error: Cannot find module 'browserify'

这是我的代码,基本上是为了替换cmdline

var browserify = require('browserify')
var fs = require('fs')

var bundler = browserify('./app.js')

bundler.transform({
    global: true
}, 'uglifyify')

bundler.bundle()
    .pipe(fs.createWriteStream('./bundle.js'))

看来我需要再次在本地为这个项目安装 browserify?

安装像 browserify 这样的 npm 模块允许您在命令行上使用 browserify 作为命令。要在项目代码中使用该模块,您必须将该模块安装为依赖项。换句话说,是的,它必须本地安装在项目的 ./node_modules 文件夹中并在 package.json 文件中引用。

来自npm documentation

  • Local install (default): puts stuff in ./node_modules of the current package root.
  • Global install (with -g): puts stuff in /usr/local or wherever node is installed.
  • Install it locally if you're going to require() it.
  • Install it globally if you're going to run it on the command line.
  • If you need both, then install it in both places, or use npm link.

如另一个答案所述,解决此问题的一种方法是您可以在本地而不是全局安装 browserify,例如:npm install --save browserify uglifyfy。然后你可以在package.json中添加一个script:

...
"scripts": {
  "build": "browserify app.js > bundle.js",
   ...
},
...

现在,npm run-script build 将知道如何找到本地 browserify,它将位于您的 node_modules/ 目录中。你的 require('browserify') 会工作,因为 browserify 现在是本地的。


解决此问题的另一种方法是 NODE_PATH env 变量。在您的 bashrc 或等效项中设置此变量,如下所示:

export NODE_PATH=$NODE_PATH:$HOME/.nvm/versions/node/v4.2.6/lib/node_modules

将路径调整到全局 node_modules 所在的位置。然后你可以 require() 你在代码中使用 -g 标志安装的任何东西。

然而,这是次优的,因为它可能导致错误和误解。但如果它用于一些快速而肮脏的脚本,它会有所帮助。