1

我试图弄清楚是否(以及如何,如果可能的话)使用RequireJS 优化工具不仅包括我的 JavaScript 模块,还包括我的“文本!” 模块。我正在开发一个使用“文本”的 Durandal 应用程序!视图模块。

有时我们的用户在尝试加载视图时会超时。这是一个示例错误:

Error: Load timeout for modules: text!views/primaryapplicants.html
http://requirejs.org/docs/errors.html#timeout

我刚刚发布了另一个关于处理超时的问题。我不知道如何拦截它并重试。我知道模块定义是有效的,只是客户可能有网络连接问题——尤其是当他们使用手机时。

然而,当我继续思考这个问题时,我意识到如果我可以简单地将整个应用程序打包到一个文件中,那么我们可以避免额外的 HTTP 调用——这可能会减少像这样的超时。这意味着应用程序要么加载,要么不加载——而不是“部分”加载的可能性。

这个应用程序没有大量的视图。我估计使用 gzip 压缩添加每个视图会增加大约 20kb。

那么,是否可以打包这些“文本”!模块不知何故?

4

2 回答 2

1

有一个inlineText构建配置选项(默认为 true),它指示优化器完全按照您的意愿进行操作。一个警告是,就像任何其他模块一样,它只会检测某些模块define()块中指定的依赖关系。换句话说,它将无法检测text!按需请求的依赖项,除非它们被明确地设置为可访问 - 这就是您的问题所在。

一种解决方法(如果您有许多视图文件,则远非理想)是指定您在构建配置中的选项text!中使用的每个依赖项,例如:include

// ...
include: ["text!views/primaryapplicants.html",
  "text!views/secondaryapplicants.html",
  // etc.
]
// ...
于 2013-10-17T22:39:42.527 回答
1

您可能想尝试一下 Durandal 的优化器 weyland。可以在 HTML StarterKit 中找到一个示例 weyland-config.js 配置。

https://github.com/BlueSpire/Durandal/blob/master/platforms/HTML/StarterKit/weyland-config.js

exports.config = function(weyland) {
    weyland.build('main')
        .task.jshint({
            include:'app/**/*.js'
        })
        .task.uglifyjs({
            include:['app/**/*.js', 'lib/durandal/**/*.js']
        })
        .task.rjs({
            include:['app/**/*.{js,html}', 'lib/durandal/**/*.js'],
            loaderPluginExtensionMaps:{
                '.html':'text'
            },
            rjs:{
                name:'../lib/require/almond-custom', //to deploy with require.js, use the build's name here instead
                insertRequire:['main'], //not needed for require
                baseUrl : 'app',
                wrap:true, //not needed for require
                paths : {
                    'text': '../lib/require/text',
                    'durandal':'../lib/durandal/js',
                    'plugins' : '../lib/durandal/js/plugins',
                    'transitions' : '../lib/durandal/js/transitions',
                    'knockout': '../lib/knockout/knockout-2.3.0',
                    'bootstrap': '../lib/bootstrap/js/bootstrap',
                    'jquery': '../lib/jquery/jquery-1.9.1'
                },
                inlineText: true,
                optimize : 'none',
                pragmas: {
                    build: true
                },
                stubModules : ['text'],
                keepBuildDir: true,
                out:'app/main-built.js'
            }
        });
}
于 2013-10-21T12:40:48.757 回答