javascript - 如何防止 Require.js 优化器将文本插件包含在优化文件中?

标签 javascript optimization requirejs

tl;dr:当我的所有文本依赖项都内联时,如何将 text.js 插件保留在优化文件之外?

我正在使用Require.js optimizer (通过 Node)优化我的项目中的一些 JS 文件。我正在使用text plugin加载文本依赖项(HTML 模板、CSS)。我有一个想要优化的模块,包括它的依赖项,如下所示:

define(['text!core/core.css'], function(styles) {
    // do setup stuff, return an object
});

Require.js 文档说,当我运行 r.js 优化器时,core/core.css 文件将被内联,我像这样调用它:

$ r.js -o baseUrl=./src name=core out=release/test.js

Tracing dependencies for: core
Uglifying file: c:/path/release/test.js

c:/path/release/test.js
----------------
c:/path/src/text.js
text!core/core.css
c:/path/src/core.js

好消息是,这有效。当我查看优化后的文件时,我可以看到内联文本,如下所示:

define("text!core/core.css",[],function(){return"some CSS text"}),
define("core",["text!core/core.css"],function(a){ ... })

坏消息是,text.js 插件也包含在内 - 它增加了大约 3K,并且包含(据我所知)现在完全不必要的用于加载外部文本文件的代码。我知道 3K 并不多,但我试图保持我的代码高度优化,并且据我了解,如果我的文本依赖项是内联的,则文本插件的代码根本没有必要。我可以通过将 exclude=text 添加到我的 r.js 调用中来保留文本插件,但如果这样做,当我尝试使用优化代码时会收到错误在浏览器中显示 text.js 插件无法加载。

所以:

  1. 这里实际上需要有什么原因吗?

  2. 如果没有,r.js 是否有一个配置选项可以修复此行为,或者

  3. text.js 插件是否有一个简单的填充程序,我可以添加它来说服 Require.js 加载了不必要的插件?

最佳答案

文本插件确实是必需的,因为 RequireJS 需要在检索正确的模块 ID 之前检查插件是否实现了 normalize 方法。

从构建中删除文本插件的方法是使用 onBuildWrite 设置创建一个空插件模块,如本问题评论中所述:https://github.com/jrburke/r.js/issues/116#issuecomment-4185237 - 此功能应该登陆 r.js 的 future 版本

编辑:

r.js 现在有一个名为 stubModules 的设置,它的作用正是如此:

//Specify modules to stub out in the optimized file. The optimizer will
//use the source version of these modules for dependency tracing and for
//plugin use, but when writing the text into an optimized layer, these
//modules will get the following text instead:
//If the module is used as a plugin:
// define({load: function(id){throw new Error("Dynamic load not allowed: " + id);}});
//If just a plain module:
// define({});
//This is useful particularly for plugins that inline all their resources
//and use the default module resolution behavior (do *not* implement the
//normalize() method). In those cases, an AMD loader just needs to know
//that the module has a definition. These small stubs can be used instead of
//including the full source for a plugin.
stubModules : ['text']

有关更多 r.js 选项,请查看 example.build.js文件。

关于javascript - 如何防止 Require.js 优化器将文本插件包含在优化文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10196977/

相关文章:

javascript - 对 nvd3 图表上的条形进行排序

javascript - 使用 JQuery 创建或删除数十个 div 时如何优化性能?

javascript - 无法使用 require.js 读取 Handlebars 模板的数据对象文件

javascript - 通过 requirejs 自动加载模块

javascript - 将矩形对齐到圆内

javascript - 请求的 URL "[no URL]"无效。 Node http-proxy

c++ - 更正我的次优二进制搜索

python - 具有工作时间上下文的日期时间列表,计算非工作时间

javascript - Require.js 模块加载顺序

javascript - jQuery 检测动态添加元素的事件