RequireJS:将插件动态应用于模块id
RequireJS: apply plugin to module id dynamically
我使用的是requirejs babel插件,它需要为所有需要babel转换的模块ID预先添加'es6!'
。
define(['es6!some-es6-module'], function(module) {
// ...
});
RequireJS中是否有API允许我检查模块id并根据需要准备插件id?例如,如果我想将'es6!'
应用于特定目录中的所有模块ID?
最终,我需要能够编写这样的定义define(['some-es6-module'], ...)
,并根据模块id自动添加es6!
前缀
- 不查找有关SystemJS的信息,也不查找提前进行转换的gullow任务等
- 具体的模块ID在配置时还不知道——我只知道在某些位置/目录中,模块需要
es6!
- 需要在运行时在浏览器中工作
我不能100%确定您的总体目标(您希望永久保存添加到模块ID的es6还是始终自动添加?),但您可以使用RequireJS映射来替换已定义模块的模块ID。例如:-
requirejs.config({
map: {
// * - for all modules that require these, do this
'*': {
'some-es6-module': 'es6!some-es6-module'
}
}
});
然而,考虑到您的用例,您可能需要比这更复杂的东西,因为映射假设您有实际不同版本的文件,并且通常用于此目的。
我认为您希望避免的一个更复杂的解决方案可能是在r.js中优化文件并通过Node加载/编辑文件之前动态循环文件。它会变得有点乱!
var config = requirejs.s.contexts._.config;
var needBabel = ['some-es6-module', 'another-module-name', 'another'];
for (var property in config.paths) {
if (config.paths.hasOwnProperty(property) && needBabel.indexOf(property) > -1) {
// load the module in node
// fs.readFileSync(__dirname + config.paths[property] + '.js');
// dynamically modify this file with text replacement
// save this file via Node again
}
}
// run Require JS optimiser
// undo everything you've just done when optimisation is complete
我最终覆盖了load
方法。覆盖使用具有映射路径的模块的标准加载,否则使用es6
(requirejs-babel)插件加载模块。
require.standardLoad = require.load;
require.load = function(context, moduleName, url) {
var config = requirejs.s.contexts._.config;
if (moduleName in config.paths) {
return require.standardLoad(context, moduleName, url);
}
require(['es6'], function(es6) {
es6.load(
moduleName,
require,
{
fromText: function(text) {
require.exec(text);
context.completeLoad(moduleName);
}
},
{});
});
};
它在这里发挥作用:https://gist.run/?id=7542e061bc940cde506b
相关文章:
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何将返回的值应用于多个不同位置的多个选择器
- ThreeJS将画布中的文本渲染为纹理,然后应用于平面
- 如何使jQuery中的悬停函数单独应用于数据库映像
- 如何将jquery函数仅应用于大屏幕
- 将jQuery事件应用于所有类元素
- 在将绑定应用于控制器之后,是否会发出Angular$scope事件
- 如何在ExtJs中获得将应用于给定类列表的样式
- 将 CSS 应用于禁用的输入按钮
- 如何从应用于正文的css中排除特定的表单
- jQuery+Android.将功能(Touchstart、touchmove)应用于实时加载的内容
- 将敲除绑定应用于模板,并将结果作为字符串获取
- 如何将Angular2管道应用于动态内容
- 动画功能不应用于每个元素
- 仅将JavaScript应用于部分代码(例如菜单)
- 将iframe中的css类应用于主文档
- jQuery:如何在没有for循环的情况下将事件处理程序应用于$('#text'+'任意整数
- 如果使用jQuery验证器插件找到单选按钮,则将不同的addMethod应用于字段
- RequireJS:将插件动态应用于模块id
- RequireJS-将构造函数应用于模块