我怎样才能使用NPM的前端依赖?

我想问一下是否有可能(通常是一个好主意)使用npm来处理前端依赖(Backbone,jQuery)。

我发现Backbone,jQuery等都可以通过NPM,但我将不得不设置另一个提取点(默认是node_modules )或符号链接或其他…

有人做过这个吗?

可能吗?

package.json有什么需要改变的地方?

简短的回答: 有点

这在很大程度上取决于模块作者是否支持这一点,但并不常见。 Socket.io就是这种支持模块的一个例子,正如他们的着陆页所示。 还有其他解决scheme。 这些是我真正了解的两个东西:

  • – Ender JS,自我描述的用于客户端模块的NPM模拟器。 有点过于涉及我的口味。
  • https://github.com/substack/node-browserify – Browserify,一个将会走你的依赖的实用程序,并允许你通过模拟node.js模块模式输出一个脚本。 您可以使用jake | make | build脚本来吐出你的application.js,甚至可以自动化它,如果你想要的话。 我简单地使用了这个,但是认为它有点笨重,并且变得烦人的debugging。 另外,并不是所有的双环境npm模块都喜欢通过browserify来运行。

就我个人而言,我正在select使用RequireJS( http://requirejs.org/ )并手动pipe理我的模块,类似于Mozilla如何使用其BrowserQuest示例应用程序( https://github.com/mozilla/BrowserQuest )。 请注意,这样做带来的挑战是不得不使用骨干或下划线等模块来取消对AMD样式模块加载器的支持。 你可以在这里find一个什么参与shimming的例子: http : //tbranyen.com/post/amdrequirejs-shim-plugin-for-loading-incompatible-javascript

实际上,无论如何,它似乎都会受到伤害,这就是为什么本机模块支持成为如此热门话题的原因。

+1使用Browserify。 我们在diy.org上使用它并且喜欢它。 Browserify背后的最佳介绍和推理可以在Browserify手册中find。 那里包括CommonJS和AMD解决scheme,构buildpipe道和testing等主题。

Browserify工作得很好的主要原因是它透明地工作与NPM。 只要一个模块可以被需要,它可以被Browserified(尽pipe不是所有的模块都可以在浏览器中工作)。

基本:

 npm install jquery-browserify 

main.js

 var $ = require('jquery-browserify'); $("img[attr$='png']").hide(); 

然后运行:

 browserify main.js > bundle.js 

然后在你的HTML文件中包含bundle.js ,并执行main.js的代码。

我们的团队维护一个名叫Lineman的工具来构build前端项目。 这个工具是基于节点的,所以一个项目依赖于很多npm模块来运行服务器端来构build你的资产,但是它们希望能够find你的客户端依赖关系并复制并提交给vendor/js

然而,一些人(包括我自己)已经尝试了与browserify的整合,而且我们遇到了很多复杂性和问题,从(a)npm模块被第三方维护,这些模块或者过时或者添加(b)由于AMD / Require.js包装的原因,当传统上每当定义了一个名为require的顶级函数时,实际的库就开始失败。

我的短期build议是坚持不懈地坚持好的老式脚本连接,直到尘埃落定。 在你有足够大或足够复杂的问题以保证它的可用性之前,我怀疑你会花费更多的时间来debugging和修复你的构build。 而且我认为我们大多数人都认为,把时间用在你的应用程序代码上,而不是构build工具上。

我个人使用webmake为我的小项目。 它是浏览器的一种替代方式,它将npm依赖关系带入你的浏览器,而且显然更轻。

我没有机会详细比较browserify和webmake,但我注意到webmake不能很好地使用全局variables,如socket.io(这是充满膨胀海事组织)的模块。

我会谨慎的RequireJS,这已经在上面推荐了。 因为它是一个AMD加载器 ,您的浏览器将asynchronous加载您的JS文件。 这将导致更多的客户端和服务器之间的交stream,并可能降低人们从移动networking浏览/在糟糕的WiFi下的用户体验。 而且,如果您成功保持JS代码简单而小巧,则绝对不需要asynchronous加载!

你可能想看看http://jspm.io/这是一个浏览器包pipe理器。 也有不错的ES6支持。