首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在生产env中动态加载多个优化的需求模块?

如何在生产env中动态加载多个优化的需求模块?
EN

Stack Overflow用户
提问于 2012-08-07 23:14:04
回答 2查看 1.4K关注 0票数 7

我已经开始在一个虚拟项目中使用require。现在我想使用r.js脚本来构建我的项目以供生产。

其背景是:

  • 名为start.js的主文件是: 需要( /*一些东西*/,函数(){ /*应用逻辑*/ }); 它有一个if,它根据某些条件决定了我应该要求什么。
  • 所需文件为ModuleA或ModuleB。
  • ModuleA和ModuleB都有依赖关系。 定义(/*some deps */,函数(dep1,dep2.){ /*应用逻辑*/返回{ /*接口*/}
  • 在开发模式下,在优化和模块连接之前,一切都很好。
  • 当使用r.js构建时,我指定为模块的目标如下:模块:{ name:"start“},{ name:"ModuleA”},{ name:"ModuleB“}

问题是我的ModuleA变成了:

代码语言:javascript
复制
 define(dep1 ..);
 define(dep2 ..);
 define(ModuleA ..);

但是没有任何东西从ModuleA加载。来自ModeulA的代码在开发中加载并执行,代码生成后加载但不运行。

我怎么才能解决这个问题?

更新

http://pastebin.com/p1xUcY0A -> start.js

http://pastebin.com/dXa6PtpX -> ModuleA js-动画.js

http://pastebin.com/xcCvhLrT -> ModuleB css-动画. deps deps。

http://pastebin.com/j51V5kMt ->运行优化器时使用的r.js配置文件。

http://pastebin.com/UVkWjwe9 ->js-动画.js如何处理运行r.js的问题。这是有问题的文件。我没有从这个文件中得到js动画模块。要求不返回我的js动画对象。

编辑:

在删除模块定义末尾的.js之后,从js开始,优化的start.js是http://pastebin.com/LfaLkJaT,js-动画模块是http://pastebin.com/qwnpkCC6。在chrome中,我在控制台http://pastebin.com/Hq7HGcmm中得到了这个错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-20 06:57:52

对于当前的require.js实现来说,这似乎是个问题。方法是创建一个全局中介或中介模块,并让所有动态加载的模块调用中介,并通过事件宣布自己。这对我有用。

票数 1
EN

Stack Overflow用户

发布于 2012-08-18 13:59:50

我认为您的设置的问题在于您在.js中结束了模块依赖名。根据文件:

默认情况下,RequireJS还假定所有依赖项都是脚本,因此它不会在模块ID上看到尾随的".js“后缀。当将模块ID转换为路径时,RequireJS将自动添加它。

如果RequireJS看到以.js结尾的模块名,则假定模块名称是相对于文档的路径。通过在.js中结束模块依赖名,它在开发模式下工作良好,因为RequireJS将加载指定为依赖项的文件。在您的示例中,它将加载文件js/js-animation.js,查看匿名define并正确加载模块。

在生产中,您的start.js模块仍然需要"js/js-animation.js"。RequireJS将在path js/js-animation.js加载优化模块,但现在优化器已经将您的匿名模块转换为命名模块(在本例中为"js/js-animation")。其结果是文件将被加载,但是文件中没有define'd模块具有与"js/js-animation.js"匹配的名称,因此从某种意义上说,您的动画模块是缺失的。

解决方案/ TL;DR:从所有模块依赖名(以及r.js配置中的模块定义)中移除尾随的.js,您应该没事。因此,您的start.js应该变成(第4行的更改):

代码语言:javascript
复制
require([], function () {
  var $html = $("html"),
    animationModule = localStorage['cssanimations'] == 'true' ? 
    'js/css-animation' : 'js/js-animation',
    $doc = $html.find("body");

  console.debug("loading ", animationModule);
  require([animationModule], function( animationModule ) {
    animationModule.run({
      target : $("div.flex")
    });
  } );
} );

还请注意,您可能希望在您的baseUrl配置中使用pathspaths来清理模块名(例如,您可以删除js/前缀)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11855422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档