Require.js在优化后继续加载未压缩的模块

时间:2014-04-23 17:39:05

标签: javascript optimization requirejs r.js

我已经运行了r.js优化器,它似乎正常运行。我唯一遇到的麻烦是,当压缩的优化版本加载时,它会继续加载所有未压缩的模块。这会发生什么原因?

enter image description here build.js

{
appDir: '../static',
mainConfigFile: '../static/javascript/config.js',
dir: '../public',
baseUrl: 'javascript/libs',
useStrict: false,
wrap: false,
optimizeCss: "standard",
optimize: "uglify2",
generateSourceMaps: false,
preserveLicenseComments: false,
uglify2: {
    "screw-ie8": true,
    warnings: false,
    mangle: true
},
throwWhen: {
    optimize: true
},
pragmasOnSave: {},
modules: [

    {
        name: '../front',
        include: ['views/front/main'],
        exclude: ['../config']
    }

    ,

    {
        name: '../portal',
        include:  ['views/portal/main'],
        exclude: ['../config']
    }

    ,

    {
        name: '../survey',
        include:  ['views/survey/main'],
        exclude: ['../config']

    }

]
}

config.js

require.config({
  baseUrl: '/javascript/libs',
  urlArgs: 'v=' + (new Date()).getTime(),
  enforceDefine: false,
  paths: {
    collections: '../collections',
    etc: '../etc',
    models: '../models',
    views: '../views',
    templates: '../../templates',
    backbone: 'backbone',
    underscore: 'lodash',
    'underscore.string': 'underscore.string',
  },
  shim: {
    backbone: {
      deps: ['jquery', 'underscore'],
      exports: 'Backbone'
    },
    underscore: {
      deps: ['jquery', 'underscore.string'],
      exports: '_'
    },
  }
});

配置加载如下:

<script data-main="/javascript/portal-v2.0.0.js" src="/javascript/libs/require.js"></script>

和portal.js看起来像这样:

require(['./config'], function() {
  return require(['views/portal/main']);
});

1 个答案:

答案 0 :(得分:0)

您开始加载您的应用程序:

<script data-main="/javascript/portal-v2.0.0.js" src="/javascript/libs/require.js"></script>

这样做是安排加载portal-v2.0.0.js文件。但是,它的实际负载在未来的某个不确定点发生。 (顺便说一句,你不应该将.js放在模块名称的末尾。data-main的值是模块名称,因此没有.js。它可能会导致细微的问题。 )

正如您获得的加载模式所证明的那样,到下面的代码执行时,上面的模块还没有加载:

require(['./config'], function() {
  return require(['views/portal/main']);
});

当RequireJS到达require(['views/portal/main'])时,它会找到并加载单个模块而不是捆绑包。

此处的解决方案是将以下内容添加到运行时配置中:

bundles: {
    '/javascript/portal-v2.0.0': ['views/portal/main'],
}

这告诉RequireJS,当您需要名为views/portal/main的模块时,它应该在名为/javascript/portal-v2.0.0的模块所在的同一位置查找它。 (并且请记得从.js移除data-main扩展名。)您需要列出portal-v2.0.0中所有模块,只列出那些您需要来自外部 portal-v2.0.0。请注意,对于其他捆绑包,如果之外需要任何模块,则情况也是如此,您必须在适当的bundles设置中列出这些模块。

您还应该查看removeCombined以从输出目录中删除单个文件,并仅保留优化的捆绑包。