几天前我遇到了问题,这意味着我需要JS loader。
我有以下文件:
#c.js
var c = {//something};
#b.js
var b = Object.create(c);
#main.js
var a = Object.create(b);
a.foo = 'bar';
我需要从“c.js”开始按顺序加载这些文件。
我对js加载器进行了一些快速的研究,发现它们中的许多不能像我的例子一样工作(或者以丑陋的方式工作)和深度依赖,并且只要它们获得就会立即启动回调函数加载给定的依赖项,而不必担心给定依赖项中的依赖项(如果你现在是我的意思)。
虽然像requireJs这样的一些严重的加载器可以做到这一点,但我发现它们有点令人讨厌的b / c这样的情况:
define([
'jQuery',
'Underscore',
'Backbone',
'views/projects/list',
'views/users/list'
], function($, _, Backbone, Session, projectListView, userListView){
......代码过多,只有少数依赖。
另外我不喜欢我应该修改一些脚本,所以他们会返回类似于jQuery的东西,它应该返回$。
我节省了时间,避免尝试所有的装载机,我创造了这个问题。
所以,最重要的问题是,哪个JS加载器可以执行以下操作:
我希望如何看待它的一些例子:
#c.js
require([], function(){
var c = {//something};
});
#b.js
require(['c.js'], function(){
var b = Object.create(c);
});
#main.js
require(['b.js'], function(){
var a = Object.create(b);
a.foo = 'bar';
});
*对不起我的英语。
P.S。 - 实际上我写了自己的加载器,它确实给了东西,并且更小(580bytes)甚至然后$ script.js,但是,当需要某些东西时,应该传递当前脚本的文件名,就像这样require('main.js', ['b.js'], function(){});
- 但是我不想依靠我的实现。
答案 0 :(得分:0)
这是如何使用require.js
实现您的要求的一种方式:
// c.js
define(
{/*something*/}
);
// b.js
define(['c.js'], function(c) {
return Object.create(c);
});
// main.js
require(['b.js'], function(b) {
var a = Object.create(b);
a.foo = 'bar';
});
对我而言,这看起来非常接近你想看的东西,不是吗?
如果您有多个依赖项,例如jQuery,Backbone等,并希望将所有内容分离,那么最终会出现类似第二个列表的内容。但是,一种不同的方法可能是在全局加载“全局”库(如jQuery)而不使用加载器,让require.js
只处理自己的类和代码部分。
答案 1 :(得分:0)
已经有一段时间了,因为我问过这个问题。 问题的解决方案只是使用requireJs,但以另一种方式定义模块:
define(require){
var dep1 = require("dep1"),
dep2 = require("dep2");
var MyModule = {//define something};
return MyModule;
};