为什么需要两次安装Browserify进行捆绑

我创build了一个新的项目

npm install -g browserify

我使用cmdline进行了testing, browserify app.js > bundle.js 。 凉。

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

我使用cmdline进行testing, 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文档 :

  • 本地安装(默认):将东西放在当前软件包根目录的./node_modules中。
  • 全局安装(使用-g ):把东西放在/usr/local或安装节点的/usr/local
  • 如果你打算require()它在本地安装。
  • 如果要在命令行上运行它,请全局安装它。
  • 如果你需要两个,那么在两个地方安装它,或使用npm link

正如另一个答案所说,解决这个问题的一个方法就是你可以在本地而不是全局npm install --save browserify uglifyfy ,比如: npm install --save browserify uglifyfy 。 然后你可以在package.json添加一个script

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

现在, npm run-script build会知道如何find本地的browserify,它将在你的node_modules/目录下。 而你的require('browserify')将起作用,因为browserify现在是本地的。


另一种可以解决这个问题的方法是NODE_PATH envvariables。 在你的bashrc或等价物中设置这个variables:

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

调整path到您的全局node_modules。 然后你可以在你的代码中使用-g标志来require()你安装的任何东西。

然而,这是不理想的,因为这会导致错误和误解。 但是,如果这是一些快速和肮脏的脚本,它可以帮助。