如何使用 Webpack 和 React create-react-app 在 Monaco 中加载 npm 模块类型定义

2024-03-12

我想在 React 应用程序中加载 Monaco 中的一些模块类型定义以用于教程目的。

事实上,我在经历了很大的痛苦之后设法让它工作,但以一种非常hacky的方式。所以我不是问如何做,而是问如何正确地做。

我希望能用 Webpack 解决的部分是,现在我制作了一个 Node.js 脚本,它包含了所有.d.ts它可以在私有 npm 模块的 build 文件夹中找到该文件,并将它们保存在一个大的 .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);
};

返回应用程序代码,然后您可以从摩纳哥获取代码并评估代码。就我而言,当用户在反应应用程序中按下“运行”按钮时。

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);
  }
}

理论上,您应该能够要求摩纳哥打字稿工作人员为您转译该文件,但我无法使其工作。

所以我加载了typescriptServices现在在我的react index.html 文件中使用这一行。

<script src="https://unpkg.com/typescript@latest/lib/typescriptServices.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Webpack 和 React create-react-app 在 Monaco 中加载 npm 模块类型定义 的相关文章

随机推荐