import - 有没有办法从节点模块动态导入
问题描述
我想知道有没有办法从节点模块导入动态?例如导入(ace-builds/src-noconflict/mode-${file}
用于 Ace 编辑器
解决方案
使用 webpack 有两种可能性。首先是import()
通过覆盖使用ace.config.loadModule
import ace from "ace-builds"
ace.config.setDefaultValue("session", "useWorker", false)
ace.config.loadModule = function(moduleName, onLoad) {
var module, moduleType;
if (Array.isArray(moduleName)) {
moduleType = moduleName[0];
moduleName = moduleName[1];
}
var done = m=>{
console.log(moduleName, "loaded")
onLoad && onLoad(m)
};
console.log(moduleName)
var parts = moduleName.split("/");
if (parts[1] == "ext") {
import(`ace-builds/src-noconflict/ext-${parts[2]}`).then(done);
} else if (parts[1] == "theme") {
import(`ace-builds/src-noconflict/theme-${parts[2]}`).then(done);
} else if (parts[1] == "mode") {
import(`ace-builds/src-noconflict/mode-${parts[2]}`).then(done);
} else if (parts[1] == "keyboard") {
import(`ace-builds/src-noconflict/keybinding-${parts[2]}`).then(done);
} else if (parts[1] == "snippets") {
import(`ace-builds/src-noconflict/snippets/${parts[2]}`).then(done);
} else {
console.error(moduleName, "not implemented")
}
}
第二种是通过添加使用文件加载器
import "ace-builds"
import "ace-builds/webpack-resolver"
当添加到https://github.com/saba-bg/Ace-editor-dynamic-mode-import/blob/016928b521ebc5fd5b39c52352dafddd99d9df6b/src/editor/Ace.js#L7而不是 language.map 部分时,两者都适用于您的示例