我对CommonJS,AMD和RequireJS仍感到非常困惑.即使阅读了很多.
我知道CommonJS(以前称为ServerJS)是一个用于在浏览器外部使用语言时定义一些JavaScript规范(即模块)的组.CommonJS模块规范有一些像Node.js或RingoJS的实现,对吧?
CommonJS,异步模块定义(AMD)和RequireJS之间有什么关系?RequireJS是CommonJS模块定义的实现吗?如果是的话,那么什么是AMD呢?
我是Angular.js的新手,并试图理解它与Backbone.js的不同之处......我们曾经使用Backbone来管理我们的包依赖关系和Require.js.使用Angular.js做同样的事情是否有意义?
过去几天我一直在玩requirejs.我试图理解define和require之间的区别.
定义似乎允许模块分离并允许遵守依赖性排序.但它会下载所需的所有文件.虽然只需要在您需要时加载您需要的东西.
这两者可以一起使用,是否应该使用它们?
RequireJS似乎在内部执行缓存所需javascript文件的操作.如果我对其中一个必需文件进行了更改,则必须重命名该文件才能应用更改.
将版本号作为查询字符串参数附加到文件名末尾的常见技巧不适用于requirejs <script src="jsfile.js?v2"></script>
我正在寻找的是一种方法来防止这种内部缓存RequireJS所需的脚本,而不必在每次更新时重命名我的脚本文件.
跨平台解决方案:
我现在正在urlArgs: "bust=" + (new Date()).getTime()
开发和urlArgs: "bust=v2"
生产期间用于自动缓存清除,我在推出更新的所需脚本后增加硬编码版本num.
注意:
@Dustin Getz在最近的回答中提到,Chrome Developer Tools会在调试期间丢弃断点,此时Javascript文件会不断刷新.一种解决方法是编写debugger;
代码以在大多数Javascript调试器中触发断点.
服务器专用解决方案:
对于可能更适合您的服务器环境(如Node或Apache)的特定解决方案,请参阅下面的一些答案.
我有一个gulp rjs任务连接和uglifies我所有的自定义.JS文件(任何非供应商库).
我想要做的是从这个任务(控制器和指令)中排除一些文件/目录.
继承我的树:
- application
- resources
- js
main.js
- vendor
- jquery
- modernzr
- angular
- controllers
- controller1
- controller2
- controller3
- directives
- directives1
- directives2
- directives3
- widgets
- widget1
- widget2
- widget3
- widget4
- modules
- modules1
- modules2
- modules3
- modules4
Run Code Online (Sandbox Code Playgroud)
在这里,我的gulp.js
dir = {
app: 'application',
dest: 'dest',
};
config = {
src: {
js: dir.app + '/resources/js'
},
dest: {
js: dir.dest + '/resources/js' …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用RequireJS加载Backbone和Underscore(以及jQuery).使用最新版本的Backbone和Underscore,看起来有点棘手.例如,Underscore自动将自己注册为模块,但Backbone假设Underscore在全球范围内可用.我还应该注意,Backbone似乎没有将自己注册为一个模块,这使得它与其他库不一致.这是我能想到的最好的main.js:
require(
{
paths: {
'backbone': 'libs/backbone/backbone-require',
'templates': '../templates'
}
},
[
// jQuery registers itself as a module.
'http://cdnjs.cloudflare.com/ajax/libs/jquery/1.7/jquery.min.js',
// Underscore registers itself as a module.
'http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.2.1/underscore-min.js'
], function() {
// These nested require() calls are just due to how Backbone is built. Underscore basically says if require()
// is available then it will automatically register an "underscore" module, but it won't register underscore
// as a global "_". However, Backbone expects Underscore to be a global variable. To …
Run Code Online (Sandbox Code Playgroud) 我已经搜索了关于此的文档的高低,但我在任何地方都找不到任何东西.
我正在使用Aloha并希望使用他们的侧边栏原型来创建我自己的新侧边栏,附加到其他插件功能.
他们的sidebar.js从这开始,但我不能为我的生活找到任何解释它意味着什么的文档.
define( [
'aloha/core',
'aloha/jquery',
'aloha/selection'
], function (Aloha, jQuery, Selection, Plugin) {
Run Code Online (Sandbox Code Playgroud)
然后它继续在那个包装器中定义一堆函数,所以vars
还有一些proptotypes
- 我可以解决这个问题......
那是什么说法或在哪里可以找到解释?
使用Require.JS和<script>
在DOM中创建元素之间的区别是什么?
我对Require.JS的理解是它提供了加载依赖项的能力,但这不能简单地通过创建一个<script>
加载必要的外部JS文件的元素来完成吗?
例如,假设我有函数doStuff()
,这需要函数needMe()
.doStuff()
在外部文件中do_stuff.js
,而needMe()
在外部文件中need_me.js
.
这样做Require.JS方式:
define(['need_me'],function(){
function doStuff(){
//do some stuff
needMe();
//do some more stuff
}
});
Run Code Online (Sandbox Code Playgroud)
只需创建一个脚本元素即可:
function doStuff(){
var scriptElement = document.createElement('script');
scriptElement.src = 'need_me.js';
scriptElement.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(scriptElement);
//do some stuff
needMe();
//do some more stuff
}
Run Code Online (Sandbox Code Playgroud)
这两项都有效.但是,第二个版本不要求我加载所有Require.js库.我真的没有看到任何功能差异......
我有一个我想测试的AMD模块,但我想模拟它的依赖项而不是加载实际的依赖项.我正在使用requirejs,我的模块的代码看起来像这样:
define(['hurp', 'durp'], function(Hurp, Durp) {
return {
foo: function () {
console.log(Hurp.beans)
},
bar: function () {
console.log(Durp.beans)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能模拟出来hurp
,durp
所以我可以有效地进行单元测试?
当我第一次浏览我的webapp时(通常在具有禁用缓存的浏览器中),我收到此错误.
错误:匿名的define()模块不匹配:function(require){
HTML:
<html>
.
.
.
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<script> var require = { urlArgs: "v=0.4.1.32" }; </script>
<script data-main="assets/js/main" src="assets/js/libs/require.js"></script>
<script src="assets/js/ace/ace.js?v=0.4.1.32"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
JS:
$(function () {
define(function (require) {
// do something
});
});
Run Code Online (Sandbox Code Playgroud)
无论如何知道这个错误究竟是什么意思以及它为什么会发生?
requirejs ×10
javascript ×8
jquery ×2
amd ×1
angularjs ×1
backbone.js ×1
commonjs ×1
gulp ×1
js-amd ×1
minify ×1
mocking ×1
module ×1
require ×1
uglifyjs ×1
unit-testing ×1