Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在节点中使用主干、jquery作为commonjs模块和在脚本标记中使用它们之间的区别是什么?_Jquery_Backbone.js_Browserify_Commonjs - Fatal编程技术网

什么';在节点中使用主干、jquery作为commonjs模块和在脚本标记中使用它们之间的区别是什么?

什么';在节点中使用主干、jquery作为commonjs模块和在脚本标记中使用它们之间的区别是什么?,jquery,backbone.js,browserify,commonjs,Jquery,Backbone.js,Browserify,Commonjs,我想使用browserify捆绑前端库。所以我需要主干网和jquery作为依赖项。但如果我只是简单地要求他们,这是行不通的。我必须显式设置主干。$到jquery: var _ = require('underscore'); var $ = require('jquery'); var Backbone = require('backbone'); Backbone.$ = $; 一些线程说,为了使jquery正常工作,我需要显式地传递window对象: var $ = require('jq

我想使用browserify捆绑前端库。所以我需要主干网和jquery作为依赖项。但如果我只是简单地要求他们,这是行不通的。我必须显式设置主干。$到jquery:

var _ = require('underscore');
var $ = require('jquery');
var Backbone = require('backbone');
Backbone.$ = $;
一些线程说,为了使jquery正常工作,我需要显式地传递window对象:

var $ = require('jquery')(window);
但事实上我不需要这样做,它仍然有效:

这里有什么区别? 为什么在脚本标记中使用它们时如此简单,我只需要将它们按正确的顺序排列,它就可以正常工作。
当我将这些库用作节点中的commonjs模块时,为什么需要做一些额外的工作?

在某种程度上,使用脚本标记可以很好地工作。随着添加新的前端库和新的特定于应用程序的代码,管理它们之间的依赖关系变得非常困难。当只使用脚本标记时,是的,你“只需要将它们按正确的顺序排列,它就会工作。”如果你只有几个脚本,那也没关系,但是随着项目的发展,正确地使用它们比你想象的更具挑战性(我是根据经验说的)

正如您所指出的,使用CommonJS模块可以解决这个问题。依赖项用
require
语法清楚地标注,并用
module.exports
导出,您可以忘记管理依赖项,让脚本加载器来完成。一开始它可能看起来像是开销,但它会让您的项目扩展。为JS代码设置模块系统的前期成本是值得的

使用CommonJS这样的模块系统还鼓励良好的封装,这将帮助您编写更易于维护的可重用代码组件

对于JS代码,您希望使用基于模块的系统的另一个重要原因是,在生产环境中,您可以将所有脚本捆绑在一起。使用像browserify这样的工具,您可以浏览所有脚本并将它们捆绑到一个JS文件中,这意味着每个脚本标记有一个HTTP请求,而不是一个单独的HTTP请求。这几乎总是意味着您的页面将加载得更快,尤其是在每个HTTP请求的延迟非常高的移动设备上


这里需要注意的一点是,如果您认为真正流行的库(如jQuery)可能会被用户的浏览器缓存,那么最好在页面中包含一个脚本标记(使用CDN副本)

嗨,Ryan,感谢您对使用script标记和commonjs的区别所做的精彩解释。但这并不是我要问的,我的问题是为什么我需要设置主干。$在commonjs中显式使用,而不是在脚本标记中使用时,它会自行处理。很抱歉没有回答您真正的问题。这是因为当您通过script标记加载jQuery时,它将全局
窗口。$
变量设置为jQuery对象。依赖于jQuery的库(如主干和下划线)希望找到这个全局变量。CommonJS的一个巨大好处是不会用变量弄乱全局名称空间。获取jQuery对象的唯一方法是通过调用
require('jQuery')
窗口。$
变量未定义。因此,行
主干。$=$
告诉主干网如何获取jQuery,而不需要从
窗口
对象获取它。