如何使用 Webpack 在摩纳哥加载 npm 模块类型定义并做出反应 create-react-app
How to load npm module type definition in Monaco using Webpack and react create-react-app
出于教程目的,我想在 React 应用程序中加载 Monaco 中的一些模块类型定义。
在经历了很多痛苦之后,我实际上设法让它工作了,但是是以一种非常老套的方式。所以我不是问如何做,而是问如何正确做。
我希望我可以用 Webpack 解决的部分是,现在我制作了一个 Node.js 脚本,它包含它可以在私有 npm 模块的构建文件夹中找到的所有 .d.ts
文件,并且将它们保存在一个大的 .json 文件中。
采用这种格式
{ [filePath]: 'fileContentAsString' }
然后在反应中我导入 json 并为每个调用 addExtraLib
。
for (const filePath in sdkTypesJson) {
// We add every .d.ts file to Monaco
monaco.languages.typescript.typescriptDefaults.addExtraLib(
sdkTypesJson[filePath],
'file:///' + filePath.replace('dist/src/', '')
);
}
有没有办法使用一些 webpack 魔法来避免必须创建 json 文件?
经过两天的痛苦和苦难,这是我发现最好的工作。
const files = require.context('!!raw-loader!./node_modules/my-module-name/dist/src/', true, /\.d.ts$/);
files.keys().forEach((key: string) => {
// We add every .d.ts file to Monaco
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 安装 raw-loader 模块。
然后您可以在嵌入式 Monaco 实例中使用这样的代码,并让键入智能感知像在 vs-code.
中一样工作
import {
function
} from '@my-module-name';
export default async function run(value: string) {
alert('Code ran. Value passed is ' + value);
};
返回您的应用程序代码,然后您可以从 Monaco 获取代码并评估代码。在我的例子中,当用户在 React 应用程序中按下 'run' 按钮时。
const model = editor.current.getModel();
if (model && sdk.current && editorType === 'text') {
// Be cool if Monaco worker could transpile the file to js. Don't work for some reason.
// Monaco.languages.typescript.getTypeScriptWorker()
// .then(function(worker) {
// worker(model.uri)
// .then(function(client) {
// client.getEmitOutput(model.uri.toString()).then((output: any) => {
// console.log(output);
// });
// });
// });
// @ts-ignore
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 worker 为您转译文件,但我没能成功。
所以我现在用这一行将 typescriptServices
加载到我的反应 index.html 文件中。
<script src="https://unpkg.com/typescript@latest/lib/typescriptServices.js"></script>
出于教程目的,我想在 React 应用程序中加载 Monaco 中的一些模块类型定义。
在经历了很多痛苦之后,我实际上设法让它工作了,但是是以一种非常老套的方式。所以我不是问如何做,而是问如何正确做。
我希望我可以用 Webpack 解决的部分是,现在我制作了一个 Node.js 脚本,它包含它可以在私有 npm 模块的构建文件夹中找到的所有 .d.ts
文件,并且将它们保存在一个大的 .json 文件中。
采用这种格式
{ [filePath]: 'fileContentAsString' }
然后在反应中我导入 json 并为每个调用 addExtraLib
。
for (const filePath in sdkTypesJson) {
// We add every .d.ts file to Monaco
monaco.languages.typescript.typescriptDefaults.addExtraLib(
sdkTypesJson[filePath],
'file:///' + filePath.replace('dist/src/', '')
);
}
有没有办法使用一些 webpack 魔法来避免必须创建 json 文件?
经过两天的痛苦和苦难,这是我发现最好的工作。
const files = require.context('!!raw-loader!./node_modules/my-module-name/dist/src/', true, /\.d.ts$/);
files.keys().forEach((key: string) => {
// We add every .d.ts file to Monaco
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 安装 raw-loader 模块。
然后您可以在嵌入式 Monaco 实例中使用这样的代码,并让键入智能感知像在 vs-code.
中一样工作import {
function
} from '@my-module-name';
export default async function run(value: string) {
alert('Code ran. Value passed is ' + value);
};
返回您的应用程序代码,然后您可以从 Monaco 获取代码并评估代码。在我的例子中,当用户在 React 应用程序中按下 'run' 按钮时。
const model = editor.current.getModel();
if (model && sdk.current && editorType === 'text') {
// Be cool if Monaco worker could transpile the file to js. Don't work for some reason.
// Monaco.languages.typescript.getTypeScriptWorker()
// .then(function(worker) {
// worker(model.uri)
// .then(function(client) {
// client.getEmitOutput(model.uri.toString()).then((output: any) => {
// console.log(output);
// });
// });
// });
// @ts-ignore
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 worker 为您转译文件,但我没能成功。
所以我现在用这一行将 typescriptServices
加载到我的反应 index.html 文件中。
<script src="https://unpkg.com/typescript@latest/lib/typescriptServices.js"></script>