angular - 打字稿:如何从源代码导入而不是文件
问题描述
我使用这个片段:
loadComponent(name) {
var url = this.configurationService.configuration.api_url+"/generator/dynamic-loading/component/"+name;
this.http.get(url, {responseType: 'text'}).subscribe(componentCode => {
let result = ts.transpile(componentCode);
console.log("### Component",result);
});
}
我想“从结果中导入名称”
怎么可能?
解决方案
如果我理解正确,result
是模块的 JavaScript 源代码(我将其称为“动态模块”),并且您想要加载此模块并访问其导出。假设有一个固定的、允许动态模块导入的模块列表,将动态模块转换为 CommonJS 格式并编写一个迷你模块加载器来eval
为 JavaScript 源代码设置适当的上下文可能是最简单的。
function evalCommonjsModule(moduleSource: string, requireMap: Map<string, {}>) {
let moduleFunc = eval("(module, exports, require) => {" + moduleSource + "}");
let module = {exports: {}};
moduleFunc(module, module.exports, (requireName) => {
let requireModule = requireMap.get(requireName);
if (requireModule === undefined)
throw new Error(`Attempted to require(${requireName}), which was not in requireMap`);
return requireModule;
});
return module.exports;
}
import * as AllowedImport1 from "allowed-import-1";
import * as AllowedImport2 from "allowed-import-2";
// In loadComponent:
// Example from https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API#a-simple-transform-function
let result = ts.transpileModule(componentCode, {
compilerOptions: { module: ts.ModuleKind.CommonJS }
});
let resultModule = evalCommonjsModule(result, new Map([
["allowed-import-1", AllowedImport1],
["allowed-import-2", AllowedImport2]
]));
let name = resultModule.name;
如果动态模块的导入不限于预先知道的简短列表,那么您的选项将取决于您用于主项目的模块捆绑器或加载器。由于loadComponent
已经是异步的,如果您的捆绑器/加载器支持动态导入,那么您可以将动态模块转换为 AMD 格式,并让您的迷你加载器在加载其主体之前执行动态模块的所有依赖项的动态导入。可能有现有的库可以帮助解决这个问题,但我不熟悉它们;其他人应该随时添加有关他们的信息。
推荐阅读
- r - 从其他 R 脚本中运行 R markdown (.Rmd) 以生成 HTML
- html - 如何在我的代码中为几行加载自定义 CSS?
- python - 使用 Heroku 上托管的 Selenium 登录 Instagram 时无法找到元素“用户名”
- pyspark - 改进 PySpark 实现以在图中查找连接的组件
- go - 为什么 go module ssh custom private repo (non-github) config 仍然请求 https fetch?
- database - 通过 Typoscript 查询从 Typo3 数据库中选择 url
- jquery - 从 ajax 响应更改 img 类名
- linux - 树莓派:SPI 不工作,spi_bcm2835 不显示 lsmod
- pdftron - PDFTron导入base64签名质量低
- reactjs - 如何在 React 功能组件中动态地将我的表单绑定到 Formik