Javascript RequireJS:将插件动态应用于模块id

Javascript RequireJS:将插件动态应用于模块id,javascript,requirejs,babeljs,Javascript,Requirejs,Babeljs,我使用的插件需要预先添加'es6!'到所有需要babel透明的模块ID define(['es6!some-es6-module'],函数(module){ // ... }); RequireJS中是否有API允许我检查模块id并根据需要预先添加插件id?例如,如果我想应用“es6!”到特定目录中的所有模块ID 最终,我需要能够编写这样的定义define(['some-es6-module'],…),并自动添加es6前缀,具体取决于模块id 不寻找有关SystemJS的信息,也不寻找提前进

我使用的插件需要预先添加
'es6!'到所有需要babel透明的模块ID

define(['es6!some-es6-module'],函数(module){
// ...
});
RequireJS中是否有API允许我检查模块id并根据需要预先添加插件id?例如,如果我想应用
“es6!”到特定目录中的所有模块ID

最终,我需要能够编写这样的定义
define(['some-es6-module'],…)
,并自动添加
es6前缀,具体取决于模块id

  • 不寻找有关SystemJS的信息,也不寻找提前进行透明处理的gulp任务,等等
  • 配置时不知道确切的模块ID-我只知道在某些位置/目录中,模块需要
    es6
  • 需要在运行时在浏览器中工作

我不能100%确定您的总体目标(您希望将es6添加到模块ID中永久保存还是始终自动添加?),但您可以使用来替换已定义模块的模块ID。例如:-

requirejs.config({
    map: {
        // * - for all modules that require these, do this
        '*': {
            'some-es6-module': 'es6!some-es6-module'
        }
    }
});
然而,考虑到您的用例,您可能需要比这更复杂的东西,因为映射假设您有实际不同版本的文件,并且通常用于此目的

我认为您希望避免的一个更复杂的解决方案可能是在r.js中优化文件并通过节点加载/编辑它们之前动态循环文件。它会变得有点乱

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=函数(上下文、模块名、url){
var config=requirejs.s.contexts.\uu.config;
if(config.path中的moduleName){
返回require.standardLoad(上下文、moduleName、url);
}
require(['es6'],函数(es6){
es6.1负载(
模块名称,
要求
{
fromText:函数(文本){
require.exec(文本);
context.completeLoad(moduleName);
}
},
{});
});
};

这就是它的作用:

澄清一下,您是否希望编写这样的定义,并要求自动添加es6!前缀
define(['your-es6-module'],function(module){…
正确-我将更新问题以使其更清楚您可以始终在requireJs源代码中的
define
函数中添加您自己的钩子…但是当它稍后引起问题或在升级中丢失时,您必须对其进行辩护。有一个问题()这是一个类似的钩子。