我想使用browserify捆绑前端库。所以我需要将backbone和jquery作为依赖项。但如果我只是需要它,它就不起作用。我必须明确地设置Backbone。$ to jquery:
var _ = require('underscore');
var $ = require('jquery');
var Backbone = require('backbone');
Backbone.$ = $;
有些线程说为了让jquery正常工作,我需要显式传递window对象:
var $ = require('jquery')(window);
但实际上我不需要这样做,它仍然有效:
这有什么区别? 当我在脚本标记中使用它们时,为什么它如此简单,我只需要按照正确的顺序放置它们就可以了。 当我在节点中使用这些库作为commonjs模块时,为什么需要做一些额外的工作?
答案 0 :(得分:1)
使用脚本标记可以正常工作。当您添加新的前端库和新的应用程序特定代码时,管理它们之间的依赖关系变得非常困难。当只使用脚本标签时,是的,你“只需要按照正确的顺序放置它们就可以了。”如果您只有一些脚本,那就没关系,但是随着项目的增长而做到这一点比您想象的更具挑战性(我从经验中说出这一点)。
如您所述,使用CommonJS模块可以解决此问题。使用require
语法清楚地记录依赖关系,并使用module.exports
导出,您可以忘记管理依赖关系并让脚本加载器执行此操作。一开始看起来似乎有点开销,但它会让你的项目扩展。为您的JS代码设置模块系统的前期成本将是值得的。
使用像CommonJS这样的模块系统也鼓励良好的封装,这将有助于您编写更易于维护的可重用代码组件。
您希望为JS代码使用基于模块的系统的另一个重要原因是,在生产中,您可以将所有脚本捆绑在一起。使用像browserify这样的工具,您可以浏览所有脚本并将它们捆绑到一个JS文件中,这意味着每个脚本标记有1个HTTP请求而不是单独的HTTP请求。这几乎总意味着您的页面加载速度会更快,尤其是在每个HTTP请求的延迟非常高的移动设备上。
这里需要注意的是,可能一个好主意,如果你认为它可能被缓存,那么在带有脚本标记的页面中使用非常流行的库(如jQuery)(使用CDN副本)用户的浏览器。