RequireJS Optimization和文本插件

时间:2014-02-07 16:18:58

标签: javascript node.js requirejs requirejs-optimizer

我正在使用RequireJS优化器来优化同样使用文本插件的模块。为了没有文字!每个优化模块一遍又一遍地加载插件,我这样做

node r.js -o stubModules=text name=Main out=main-master-built.js

哪个有效,部分产生以下

define("text",{load:function(e){throw new Error("Dynamic load not allowed: "+e)}})
define("text!f.htm",[],function(){return"<h3>Hello World</h3>\r\n<h4>Bam</h4>"})

不幸的是,如上所示,我不能再“正常”使用文本插件了。上面的错误抛出存根阻止我添加文本!调用未优化的依赖列表。

这有什么办法吗?是否有任何我可以选择的选项,比如,将这些text引用动态更改为texto,然后执行类似

的操作
define("texto",{load:function(e){throw new Error("Dynamic load not allowed: "+e)}})
define("texto!f.htm",[],function(){return"<h3>Hello World</h3>\r\n<h4>Bam</h4>"})

或者其他一些选项可以优化具有文本依赖性的模块,同时又不会破坏我动态使用它的能力?

1 个答案:

答案 0 :(得分:3)

这是交易。如果通过text!加载的所有内容都已使用r.js进行了优化,那么所有文本都已包含在r.js的输出中,您可以存根插件。

但是,如果您希望能够使用text!加载已通过优化过程的文本,那么您必须拥有text!插件在运行时。在这种情况下,您不能将其存根,否则RequireJS将无法加载您未优化的文本片段,因为RequireJS不会使用text!插件。

在包含text!加载的模块的应用程序已经优化且text!加载的模块尚未优化的情况下,将发生以下情况:

  • 对于已经优化的模块,RequireJS会找到一个带有模块名称的define调用(因为这是r.js所做的一部分)。例如,define("text!foo", [...], function(...)。在这种情况下,RequireJS不会尝试使用text!插件来加载此模块。它只是直接加载模块。 (此为真,否则只要需要使用text!的任何优化模块,存在text!插件就会导致RequireJS失败。)

  • 对于已优化的模块,RequireJS会要求text!加载模块。

除非采取特殊措施,否则r.js会在一组模块的依赖项中找到它时自动包含整个text!插件。

因此,要专门排除文本模块,请使用excludeShallow选项。您的新命令行/ bat文件看起来像这样:

node r.js -o name=Main excludeShallow=text out=main-master-built-text-path.js