【问题标题】:How to import local typescript module?如何导入本地打字稿模块?
【发布时间】:2021-05-08 09:02:42
【问题描述】:

我正在构建一个 TypeScript 模块,我想最终发布到 NPM,但我首先想将它导入到另一个本地宿主项目中进行测试。这两个项目都在 TypeScript 中。

模块使用tsc 成功编译,并将看似正确的文件输出到dist 目录。该模块包含一个storybook,通过相对本地路径成功导入和编译模块。

在宿主项目中,我尝试了npm link 和本地npm install ../localmodule 来导入模块。

模块tsconfig是:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "jsx": "preserve",
    "declaration": true,
    "declarationMap": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "noImplicitAny": true,
    "typeRoots": ["./src/types"],
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}

模块package.json

  "main": "dist/index.js",
  "types": "dist/index.d.ts",

当我尝试使用导入的本地模块编译宿主项目时,我遇到了一堆错误,这些错误在模块 storybook 或开发过程中没有看到。

  1. 一个关键路径错误,表明宿主项目没有看到其中一个模块导出丢失或找不到。
<e> ERROR in ../react-regl/dist/index.js 9:18-51
<e> Module not found: Error: Can't resolve './components/ReglFrame' in '/Users/kevzettler/code/react-regl/dist'
<e>  @ ./src/Ground.ts 6:0-30 11:11-21 12:15-27 20:26-30 31:13-17
<e>  @ ./src/RenderStore.ts 24:0-48 271:12-24 292:12-18 488:28-40 497:28-34
<e>  @ ./src/ClientStore.ts 18:0-40 74:32-43
<e>  @ ./src/browser.worker.ts 1:0-40 10:20-31
<e>  @ ./src/index.ts 83:21-77

此导出在模块dist 目录中得到确认:

kevs-mbp:react-regl kevzettler$ ls dist/components/
ReglFrame.d.ts      ReglFrame.d.ts.map  ReglFrame.jsx
  1. 还有一些类型错误表明宿主项目丢失或推断类型不同于storybook
<e> ERROR in /Users/kevzettler/code/hypeworks/src/Ground.ts
<e> ./src/Ground.ts
<e> [tsl] ERROR in /Users/kevzettler/code/hypeworks/src/Ground.ts(17,17)
<e>       TS2339: Property 'clear' does not exist on type 'ReactRegl'.
<e>  @ ./src/RenderStore.ts 24:0-48 271:12-24 292:12-18 488:28-40 497:28-34
<e>  @ ./src/ClientStore.ts 18:0-40 74:32-43
<e>  @ ./src/browser.worker.ts 1:0-40 10:20-31
<e>  @ ./src/index.ts 83:21-77
<e>
<e> ERROR in /Users/kevzettler/code/hypeworks/src/Ground.ts
<e> ./src/Ground.ts
<e> [tsl] ERROR in /Users/kevzettler/code/hypeworks/src/Ground.ts(19,21)
<e>       TS2339: Property 'texture' does not exist on type 'ReactRegl'.
<e>  @ ./src/RenderStore.ts 24:0-48 271:12-24 292:12-18 488:28-40 497:28-34
<e>  @ ./src/ClientStore.ts 18:0-40 74:32-43
<e>  @ ./src/browser.worker.ts 1:0-40 10:20-31
<e>  @ ./src/index.ts 83:21-77

我可以确认这些cleartexture 方法是在模块的.d.ts 文件中定义的。

宿主项目 tsconfig 的样子

{
  "compilerOptions": {
    "outDir": "./dist/",
    "sourceMap": true,
    "noImplicitAny": true,
    "module": "esnext",
    "target": "es5",
    "jsx": "react",
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "useDefineForClassFields": true,
    "lib": [
      "es2019",
      "dom"
    ],
    "exclude": [
      "./src/server.worker.ts",
      "./src/server.ts",
      "./src/network/ServerNetwork.ts",
      "./src/Worker/implementation.worker_threads.ts"
    ]
  }
}

【问题讨论】:

    标签: typescript npm webpack typescript-typings


    【解决方案1】:

    我假设您在宿主项目的编译期间使用 webpack。如果是这样,您需要在 webpack 配置文件的 resolve.extensions 属性中指定 .jsx,以便宿主项目可以识别具有这些扩展名的模块。这是一个示例 webpack.config.js 使用 resolve.extensions.js.jsx.json

    module.exports = {
      // your other config here...
      resolve: {
        extensions: ['.js', '.jsx', '.json']
      }
    };
    

    【讨论】:

    • 感谢@JoshA 我确实在宿主项目中缺少.jsxresolve。但此外,我将"jsx": "react", 添加到模块tsconfig,以便它导出默认es5。不幸的是,宿主项目仍然缺少应该包含的模块类型。有什么想法吗?我在问题中添加了更多细节
    • 我真的不能说是什么导致了Property .. does not exist on type ... 错误,除非我不幸看到更多的源代码。我假设错误消息中提到的ReactReglregl 库的某种包装器? Ground.ts 内部是如何引用它的?
    • 很高兴添加"jsx": "react" btw!
    • 好的,我发现了打字问题。在宿主项目和模块项目中,deferred-regl 的类型定义存在冲突。宿主项目中的副本没有正确的实现
    【解决方案2】:

    制作一个扩展名为 {{name}}.d.ts 的文件

    global.d.ts

    declare module "your-module-name";
    

    【讨论】:

    • 模块有它自己的.d.ts 文件导出,我不想将{{name}}.d.ts 文件提交到宿主项目,因为它最终会npm install 模块
    • 你可以在你的tsconfig中添加include "include": [ "src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "tests/**/*.ts", "tests/**/*.tsx" , "src/public-path.ts", "src/public-path.ts", "src/main.ts" ]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2021-09-14
    • 1970-01-01
    • 2022-01-14
    • 2018-01-10
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多