我们在开发过程中喜欢RequireJS和AMD,我们可以编辑模块,在浏览器中点击重新加载,然后立即看到结果.但是,当需要将我们的模块连接到单个文件进行生产部署时,显然必须有一个AMD加载器仍然存在,无论该加载器是RequireJS本身还是其较小的合作伙伴"杏仁",如下所述:
http://requirejs.org/docs/faq-optimization.html#wrap
我的困惑是:为什么装载机是必需的?除非你有非常特殊的情况使你有必要require()
在你的模块内部进行调用,否则似乎可以连接一系列AMD模块而不需要加载器.最简单的例子是一对模块,如下所示.
ModA.js:
define([], function() {
return {a: 1};
});
Run Code Online (Sandbox Code Playgroud)
ModB.js:
define(['ModA'], function(A) {
return {b : 2};
});
Run Code Online (Sandbox Code Playgroud)
鉴于这两个模块,似乎连接器可以简单地生成以下文本,而不会使生产服务器或浏览器承受RequireJS或Almond所需的额外带宽或计算.
我想象一个产生的连接器(我使用V形符号«,»来显示上面两个模块的片段插入位置):
(function() {
var ModA = «function() {
return {a: 1};
}»();
var ModB = «function(A) {
return {b : 2};
}»(ModA);
return ModB;
})();
Run Code Online (Sandbox Code Playgroud)
据我所知,这可以正确地重现AMD的语义,只需要少量的外来胶水JavaScript.有这样的连接器吗?如果没有,我会因为认为我应该写一个而变得愚蠢 - 是否真的很少有代码库由简单而干净的模块组成,define()
并且永远不需要进一步的require()
调用来启动以后的异步代码提取?
有没有办法创建一个javascript微库(没有依赖的库),它支持以下所有模块格式:
在我们的项目中,我们使用RequireJS作为模块加载器.我们的一些模块会影响全局库,因此不会直接在它们被引用的模块中使用.
例:
define(['definitely/goingto/usethis/','just/referencingthis/forpackaging'], function(useThis) {
useThis.likeIPromised();
// the following call can only be made when the second required file is available
someGlobalAvailableVariable.someMethod();
});
Run Code Online (Sandbox Code Playgroud)
在JavaScript中编写模块时,这可以正常工作.但是,我们正在逐步将项目翻译为TypeScript.鉴于上面的示例,这会导致:
import useThis = module("definitely/goingto/usethis/");
import whatever = module("just/referencingthis/forpackaging");
useThis.likeIPromised();
// I've written a definition file so the following statement will evaluate
someGlobalAvailableVariable.someMethod();
Run Code Online (Sandbox Code Playgroud)
在将其编译为JavaScript时,编译器希望对您有所帮助,并删除任何未使用的导入.因此,这会破坏我的代码,导致第二个导入的模块不可用.
我目前的工作是包括一个冗余的任务,但这看起来很难看:
import whatever = module("just/referencingthis/forpackaging");
var a = whatever; // a is never ever used further down this module
Run Code Online (Sandbox Code Playgroud)
有谁知道是否有可能将TypeScript编译器配置为在编译期间不优化模块?
我正在使用require.js和jQuery的当前稳定版本,我目前包括这样的jQuery
requirejs.config({
paths: {
'jQuery': 'vendor/jquery',
}
});
require(['jQuery'], function(jQuery) {
log(jQuery); // working
});
Run Code Online (Sandbox Code Playgroud)
我没有得到的是我真的不需要明确地回馈jQuery,因为它仍然可以工作(也在其他模块中):
require(['jQuery'], function( // nothing here ) {
log(jQuery); // working
});
Run Code Online (Sandbox Code Playgroud)
现在我不确定这是否是正确的方法,也因为使用$ dollar符号来引用jQuery不起作用!
在RequireJS中,使用require()Vs define();之间的基本区别是什么?
require(['a'], function(a) {
// some code
});
// A.js
define(['b','c','d','e'], function() {
//some code
});
Run Code Online (Sandbox Code Playgroud)
任何用例都会非常有用..
我正在研究用TypeScript做TDD的可能性.如果我在TypeScript中编写我的测试,是否可以使import语句为我测试的类返回模拟?或者是用纯JavaScript编写测试并处理自己注入AMD的唯一可行方法?
以下加载打字稿模块依赖关系的方法有什么区别?
/// <amd-dependency path="someFile"/>
/// <reference path="someFile.ts" />
import someFile = require("someFile");
Run Code Online (Sandbox Code Playgroud) 我正在为我开发的javascript库添加AMD支持.
这个库可能使用jquery但是如果没有加载jquery它仍然可以工作.
在定义模块依赖项时,有一种方法可以将依赖项设置为"可选",这样如果缺少该库,模块仍然可以工作吗?
有谁知道可以自动完成javascript AMD风格的IDE:
// my dojoConfig defined aliases to the packages I use (dojo, dmidz)
// so in dmidz/my-module.js
define(['dojo/dom-construct'], function(cons){// requiring some dojo module
cons.// <- oh it is nicely displaying list of dom-construct module methods
});
Run Code Online (Sandbox Code Playgroud)
请不要只提供您喜欢的最好,最酷的IDE.我尝试过Komodo和Webstorm,我只是无法让它们工作,或者我没有正确配置它们......但没有一个可以设置与dojoConfig相同的别名(太难了?).例如在Webstorm中,有一个库概念,我添加了dojo和我的包,但当然没有办法,如果不知道别名路径.还有一个Path Variables概念,无法理解它是如何工作的,文档太差了!
感谢您的帮助.
在一个大型网站上,requireJS实际上要快多少?
有没有人对使用异步加载的大型网站的速度进行过任何测试?
例如,使用具有大量视图(> 100)的Backbone,最好是简单地让一个视图对象一次性加载所有视图,然后始终可用,或者它们是否应根据需要异步加载?
此外,移动与桌面的这些考虑因素有什么不同吗?我听说你想限制手机上的请求数而不是大小.
amd ×10
javascript ×8
requirejs ×8
typescript ×3
almond ×1
asynchronous ×1
commonjs ×1
ide ×1
jquery ×1
js-amd ×1
performance ×1
tdd ×1
tsc ×1