使用异步加载自动列出require.js依赖项以进行r.js优化

时间:2015-02-11 13:14:13

标签: javascript asynchronous dynamic requirejs r.js

我会尝试简化我的问题。我有一个主应用程序(基本上是单页面应用程序),它需要基于自己的配置文件的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无法遵循模块的依赖关系?

任何帮助表示感谢。

干杯。

1 个答案:

答案 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'

希望能帮助有同样问题的人!