如何加载采用不同 baseURL 的模块
How to load modules which assume different baseUrl
我有一个文件结构,看起来像这样:
/js
|-module/myModule.js
|-test.js
/vendor/
/spec
|-main.js
|-js/app.js
spec/main.js
是我的入口点,我从中加载/js,
/vendor
模块,/spec
加载vendor
和spec
中的模块我没有问题,因为这些模块是假设baseUrl = '/'
构建的。
我在/js
中加载模块时遇到问题,因为这些模块是假设baseUrl = '/js'
构建的。
如何在不更改脚本代码的情况下解决此问题'/js'
?
下面是一个示例,其中包含描述问题的内联注释。
规格/主要.js
(function () {
'use strict';
require.config({
baseUrl: '../'
});
});
define([
'spec/js/app' // it works
], function (app) {
'use strict';
app.initialize();
});
spec/js/app.js
(function(){
'use strict';
define([
'js/module/myModule' // it works
], function () {
// some code
});
});
js/module/myModule.js
(function(){
'use strict';
define([
'test' // it does not works because
// it assumes that baseUrl equals '/js' and not '/'
], function () {
// some code
});
});
首先,我缺少包装代码的匿名函数中的所有()。
例如,在这段代码中:
(function () {
'use strict';
require.config({
baseUrl: '../'
});
}()); // <-- missing ()
基本上,这段代码什么都不做,因为没有被执行。当你把你的代码包装在一个匿名函数中(以避免污染全局范围,使你的代码更容易最小化,...),你必须执行它! 但当你写这篇文章时,这可能是一个错字。
我有几个解决方案,但我担心它们不能轻松解决您的问题或 100% 的情况(我不是说没有那个解决方案,我只是说我不知道)
首先,您可以在require.config对象中定义路径,如下所示:
require.config({
baseUrl: '../',
paths : {
test : 'js/test.js'
}
});
这样,您的代码就可以工作了。我知道这不是最好的解决方案,因为您必须在每个文件的路径中定义一个条目,我想您正在寻找更通用的解决方案。
使用 path,您始终可以在一个包(一组模块)的依赖项中设置前缀,因此您可以在包中组织代码,并在该模块的任何依赖项中添加前缀。如果包有一个主文件,你可以根据需要将路径添加到require.config PREFFIX,以链接到该模块当前位置的路径。
我能想到的另一个解决方案是在 js 中的模块中使用相对路径。如果您经常遇到此问题,也许您应该从现在开始始终使用相对路径定义模块的依赖项。所以
define([
'test'
], function () {
...
);
将变成:
define([
'../test'
], function () {
...
);
但是,由于我无法为您的问题想出任何真正的解决方案(在不更改 js/文件代码中的任何内容的情况下解决这个问题),如果您习惯于在不同项目之间重用一组模块,我建议开始在包的依赖项中使用相对路径。当然,以某种方式组织文件。
让我们看看是否有人为您的问题提供真正的解决方案。
- Javascript,访问一个主要对象模块模式中的每个对象
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 如何从模块链中调用函数.导出到节点中
- 尽管链接成功并已成功下载,但未找到NPM模块
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 从模块内部访问Express装载路径
- RequireJS向模块传递配置总是返回undefined
- Node.js正在更改应用程序以使用集群模块
- 在Meteor项目中安装并包含npm模块后出错
- 模块模式和这个
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- 找不到模块捆绑包
- JavaScript命名约定;静态“;类或模块
- 显示模块模式在Knockout中设置模型的新实例
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- Javascript模块系统I'I’我正在努力,但搞不明白
- 如何捆绑循环相关模块
- 如何加载采用不同 baseURL 的模块
- 要求基于ROOT URL+baseUrl+模块路径修复模块的JS加载
- 使用多个baseurl的ES6异步模块