常见问题:RequireJS 优化
如何使用优化工具?§ 1
有关 writeFile 示例,请参见常规优化页面了解基本设置。另外请参考jQuery 文档页面即使你没有使用 jQuery,它也提供了设置项目的良好方式。
如何提供一个不依赖 RequireJS 的库给其他人?§ 2
如果你正在构建一个用于可能不使用 RequireJS 或 AMD 加载器的网页上的库,你可以使用优化器将所有模块合并成一个文件,然后将其包裹在一个函数中,并使用 AMD API 的 shim。这允许你发送不需要包含完整的 RequireJS 的代码,并且可以导出任何适用于普通网页而不依赖 AMD 加载器的 API。
almond是一个非常小巧的 AMD API shim,因此可以在所有模块都通过 RequireJS 优化器打包成一个文件后替代 require.js 使用。wrap构建配置选项将在代码周围添加一个函数包装器,或者如果你需要执行额外的逻辑,也可以提供自己的包装器。
详细信息请参阅 almond 项目,了解如何使用 API shim 和 wrap 功能进行构建。
如果你需要在构建后动态加载代码,那么使用 almond + wrap 将无法满足需求,因为 almond 不能动态加载代码。此时,你可能需要对 require/define 的使用进行命名空间处理。请参见下一节。
如何为我的代码命名空间,使其能在其他人的页面中良好运行?§ 3
如果你想向可能不使用 AMD 加载器的网站提供你的代码,并且需要动态加载代码,仅仅进行简单的使用包装器生成单个文件构建是不够的。你还可能希望将你的加载需求与页面中的 AMD 加载器隔离。
命令行参数语法存在namespace构建选项可执行以下操作:
- 将 requirejs、require 和 define 的调用重命名为带有 "namespace." 前缀的形式。
- 如果文件中存在如下形式的 define 存在性检查:
typeof define === 'function' && define.amd
,则它会在 define 的引用前加上 "namespace." 前缀。 - 如果构建文件中包含 require.js,则会确保它暴露的是带 "namespace." 前缀的 API 版本。
不要直接在源码中编写 namespace.require() 或 namespace.define() 调用,而是像平常一样使用 require() 和 define(),然后通过优化器完成重命名。