我会尝试简化我的问题。我有一个主应用程序(基本上是单页面应用程序),它需要基于自己的配置文件的javascript文件。
json配置文件看起来像这样(该配置文件与requirejs无关,它是app自己的配置文件):
"modules": [
{
"categories": "categories/main"
}
]
主应用程序基本上是加载其配置json文件,并在运行时需要模块,如:
function loadModule(id, modulePath) {
require([modulePath], function(module) {
// modulePath is categories/main
});
}
我有一个看起来像这样的AMD配置:
require.config({
'paths': {
'categories':'js/app/modules/categories',
该模块如下所示:
define('categories/main', [
'categories/data/navigation'
], function (
navigation
) {
'use strict';
var CategoriesModule = function() {
};
CategoriesModule.id = 'categories';
return CategoriesModule;
});
所以这对于非缩小版本来说一切正常。
请注意,即使我在我的应用程序中动态加载模块,我仍然希望在我的应用程序中只有一个缩小的文件中缩小模块。我不想在运行时发出http请求来加载模块。
为此,我已将模块包含在我的优化版本中:
require.config({
include: [
'app/modules/categories/main'
这也很好,但这就是我想要做的。
如果你回顾一下这个模块,它需要另一个文件:'categories/data/navigation'
。
并且这个文件没有缩小,因为显然r.js无法跟踪在运行时加载的文件的依赖关系。
我希望r.js能够遵循我在此优化构建配置中“包含”的依赖关系。
所以要解决这个问题,我需要在我的优化构建配置中执行以下操作:
require.config({
include: [
'app/modules/categories/main',
'app/modules/categories/data/navigation'
换句话说,模块正在使用的文件列表,这正是我想要避免的。
我认为findNestedDependencies
可以解决问题,但事实并非如此。这是我的r.js配置信息:
options: {
paths: {
'main': 'js/main'
},
logLevel: 0,
baseUrl: 'public',
mainConfigFile: ['build/optimization/require.config.js', 'public/js/app/config/amd.js'],
generateSourceMaps: false,
preserveLicenseComments: true,
name: 'main',
out: 'public/js/main.min.js',
removeCombined: true,
findNestedDependencies: true,
uglify: {
beautify: false,
mangle: false
}
}
这个应用程序相当大,在创建模块时限制所需的工作非常重要,“即插即用”模块就是我所追求的。
列出模块用于缩小的所有文件是我想要找到的解决方案。
任何提示?有什么想法吗?
为什么当我在优化配置中包含模块的主文件时,r.js无法遵循模块的依赖关系?
任何帮助表示感谢。
干杯。
答案 0 :(得分:1)
我会回答我自己的问题。 r.js无法遵循模块的依赖关系,因为我在构建优化配置中包含了模块的完整路径。使用路径快捷方式(也就是模块的已定义名称),r.js可以跟踪依赖关系。
我不确定为什么,但我想这可能是有道理的。
而不是使用:
require.config({
include: [
'app/modules/categories/main'
包含应该是:
require.config({
include: [
'categories/main'
可能是因为需要配置路径:
require.config({
'paths': {
'categories':'js/app/modules/categories'
希望能帮助有同样问题的人!