Javascript requirejs中的模块加载顺序
我们在现有项目中遇到了一个有趣的问题Javascript requirejs中的模块加载顺序,javascript,requirejs,r.js,Javascript,Requirejs,R.js,我们在现有项目中遇到了一个有趣的问题 我们使用的是requireJS 我们所有的模块都与AMD兼容(我们有很多) 我们需要将巴贝尔polyfill的一个子集作为AMD模块加入到项目中 无法手动将此依赖项逐个添加到所有模块中 我们的代码使用r.js 我们的主文件如下所示://main.js require( [ 'router', 'someOtherModule', /* In reality we have quite a few more here */ ], functio
r.js
main.js
require(
[
'router',
'someOtherModule', /* In reality we have quite a few more here */
], function(Router, AppModule) {/*... app code ...*/}
)
因此,我们希望在将任何其他模块加载到main.js
什么不起作用:
路由器
——在r.js吐出的缩小代码中,不能保证polyfill
实际上会出现在路由器
之前的代码中,这不是定义的行为,因此不能指望require['polyfill']
调用包装所有的东西似乎会把r.js优化器搞砸,如果其他模块包装在require[]
中,它们似乎不会捆绑在一起polyfill
是一个AMD模块,我们不能只将其包含在
所以问题是-我们试图做的是可能的吗?每当我加载多边形填充时,我总是将它们加载到
头部的脚本元素中。我从不通过RequireJS加载它们。正如您所发现的,通过RequireJS加载它们会引起各种各样的问题。你写道:
由于polyfill是AMD模块,我们不能仅将其包含在
中
使用Browserify将babel polyfill
包装入脚本,该脚本可通过script
元素加载:
#!/bin/sh
set -ex
BROWSERIFY_CMD="../../node_modules/browserify/bin/cmd.js"
UGLIFY_CMD="../../node_modules/uglify-js/bin/uglifyjs"
mkdir -p dist
node $BROWSERIFY_CMD lib/index.js \
--insert-global-vars 'global' \
--plugin bundle-collapser/plugin \
--plugin derequire/plugin \
>dist/polyfill.js
node $UGLIFY_CMD dist/polyfill.js \
--compress keep_fnames,keep_fargs,warnings=false \
--mangle keep_fnames \
>dist/polyfill.min.js
如果您检查dist/polyfill.js
,您会发现它不是AMD模块。(它调用的define
函数不是AMD的define
函数。)
您应该能够根据您使用的babel polyfill
的任何子集调整此方法。每当我加载polyfill时,我总是将其加载到头部的脚本
元素中。我从不通过RequireJS加载它们。正如您所发现的,通过RequireJS加载它们会引起各种各样的问题。你写道:
由于polyfill是AMD模块,我们不能仅将其包含在
中
使用Browserify将babel polyfill
包装入脚本,该脚本可通过script
元素加载:
#!/bin/sh
set -ex
BROWSERIFY_CMD="../../node_modules/browserify/bin/cmd.js"
UGLIFY_CMD="../../node_modules/uglify-js/bin/uglifyjs"
mkdir -p dist
node $BROWSERIFY_CMD lib/index.js \
--insert-global-vars 'global' \
--plugin bundle-collapser/plugin \
--plugin derequire/plugin \
>dist/polyfill.js
node $UGLIFY_CMD dist/polyfill.js \
--compress keep_fnames,keep_fargs,warnings=false \
--mangle keep_fnames \
>dist/polyfill.min.js
如果您检查dist/polyfill.js
,您会发现它不是AMD模块。(它调用的define
函数不是AMD的define
函数。)
您应该能够使此方法适应您所使用的babel polyfill
的任何子集