经过两天的痛苦和折磨,我发现以下方法最有效。
const files = require.context('!!raw-loader!./node_modules/my-module-name/dist/src/', true, /\.d.ts$/);
files.keys().forEach((key: string) => {
Monaco.languages.typescript.typescriptDefaults.addExtraLib(
files(key).default,
'file:///node_modules/@adsk/fd-modeling-sdk/' + key.substr(2)
);
});
require.context
告诉Webpack从该路径中匹配正则表达式的所有文件进行捆绑。这里我获取了包含模块类型描述的所有.d.ts
文件。
!!raw-loader!
告诉Webpack加载文件而不尝试执行它。这会导致浏览器崩溃。您需要为Webpack安装raw-loader模块。
然后,您可以在嵌入的Monaco实例中使用类似于vs-code中的代码,并使打字感知像在vs-code中一样工作。
import {
function
} from '@my-module-name';
export default async function run(value: string) {
alert('Code ran. Value passed is ' + value);
};
回到你的应用程序代码中,你可以从 Monaco 获取代码并评估代码。在我的情况下,当用户在 react 应用程序中按下“运行”按钮时。
const model = editor.current.getModel();
if (model && sdk.current && editorType === 'text') {
const js = window.ts.transpile(model.getValue());
const setup = `const exports = { default: null };`;
const final = setup + ' ' + js;
try {
const runMethod = eval(final);
const newState = await runMethod('My value');
} catch (error) {
console.error(error);
alert(error);
}
}
在理论上,你应该能够要求 Monaco typescript 工作者为你转译文件,但我没办法让它正常工作。
因此,暂时我在我的 React index.html 文件中加载了 typescriptServices,使用以下代码行。
<script src="https://unpkg.com/typescript@latest/lib/typescriptServices.js"></script>
addExtraLib
的帖子,所以我们又回到了起点:D - jfmmm