2

我正在尝试使用 RequireJS 将我们的 JS 模块化为几个更大的 JS 文件,以便可以按需加载依赖项,但在加载页面时无需大量的单个 JS 下载。

例如,JS 文件为:

  • js/main.js
  • js/views/category1/js1.js
  • js/views/category1/js2.js
  • js/views/category2/js1.js
  • js/views/category2/js2.js

应用程序的某些部分(例如 category1 中的所有内容)仅由某些类型的用户使用,与 category2 类似,因此为每个用户加载它是没有意义的。

我正在尝试为 r.js 构建配置,以创建两个动态加载的模块(category1.js 和 category2.js),其中包含各自 js1.js 和 js2.js 文件中的所有代码。

({
appDir: './',
baseUrl: './js',
dir: './dist',
modules: [
    {
        name: 'main',
        exclude: [
            "category1",
            "category2"
        ]
    },
    {
        name: "category1",
        include: [
            "views/category1/js1",
            "views/category1/js2"
        ],
        create: true
    },
    {
        name: "category2",
        include: [
            "views/category2/js1",
            "views/category2/js2"
        ],
        create: true
    }
],
fileExclusionRegExp: /^(r|build)\.js$/,
writeBuildTxt: false,
optimizeCss: 'standard',
removeCombined: true,
paths: {
    jquery: 'lib/jquery',
    underscore: 'lib/underscore',
    backbone: 'lib/backbone/backbone'
},
shim: {
    underscore: {
        exports: '_'
    },
    backbone: {
        deps: [
            'underscore',
            'jquery'
        ],
        exports: 'Backbone'
    }
}
})

但是,在加载编译后的输出时,浏览器会抱怨找不到views/category1/js1、views/category1/js2 等。

我什至不确定是否可以从 RequireJS 中的多个较小的 JS 文件创建一些高级模块。有没有人有这方面的经验?

编辑

主.js:

require.config({
    shim: {
        underscore: {
            exports: '_'
        },
        backbone: {
            deps: [
                'underscore',
                'jquery'
            ],
            exports: 'Backbone'
        }
    },
    paths: {
        jquery: 'lib/jquery',
        underscore: 'lib/underscore',
        backbone: 'lib/backbone/backbone'
    }
});

require([
    'views/app',
    'router'
], function(AppView, Router) {
    new Router();
    Backbone.history.start();
});

索引.html:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <script data-main="js/main" src="js/lib/require/require.js"></script>
</head>
<body></body>
</html>

JS1、JS2 等文件是从 router.js 中引用的。

4

1 回答 1

2

当你这样做require(['A'], ...)或者你有一个define(['A'], ...时,RequireJS 检查它的配置来解析名称A,并构建一个它用来加载模块的 URL A。它可能会尝试加载类似:

http://localhost/js/A.js

如果您优化您的模块,使A, B,C包含在一个名为 的包中category1,您有以下可能性:

  1. 捆绑包category1被加载,然后请求A. 这很好,因为在加载A时发现category1

  2. 捆绑包尚未加载,但已请求A. 这是一个问题,因为它将A以与没有优化相同的方式解决。但是你在这里遇到了一个问题,因为如果你优化了你的模块,那么A外部不再可用category1(因为removeCombinedis true)。

解决方案是在运行时配置中告诉 RequireJS,该包包含您要加载的模块。您bundles为此使用选项。例如:

bundles: {
  category1: ['A', 'B', 'C']
}

这告诉 RequireJS,“当你想加载 module 时A,加载category1然后你会在那里找到它”。

请注意,您不必列出捆绑包中的每个模块。例如,如果您有一个模块X,并且您知道唯一要加载它的模块是同一个包的一部分,那么您不需要将其列为bundles.

于 2016-08-17T23:02:29.123 回答