Jez*_*Jez 9 javascript node.js transpiler typescript
好的,所以我在设置 Node.js TypeScript 项目时遇到了一个有趣的情况。我希望能够使用非相对require引用来引用我的本地模块。TypeScript 和 Node.js 查找模块的方式是node_modules在当前目录中查找目录,然后在每个父目录中查找,直到找到包含引用的目录。因此,假设我有一个要在以下目录结构中引用的模块:
/node_modules <-- Main NPM modules dir
/...
/package.json
/src
/node_modules <-- My local modules dir
/modules
/myModule.ts
/scripts
/init.ts
Run Code Online (Sandbox Code Playgroud)
...在init.ts我这样引用myModule:
import myModule from "modules/myModule";
Run Code Online (Sandbox Code Playgroud)
据我了解,我希望 TypeScript 将我的node_modules目录dist与所有其他.ts文件目录一起转换到输出目录,以便该dist目录如下所示:
/node_modules <-- Main NPM modules dir
/...
/package.json
/dist
/node_modules <-- My local modules dir
/modules
/myModule.js
/scripts
/init.js
Run Code Online (Sandbox Code Playgroud)
然后,当 Node.js 查找模块时,它会在dist/node_modules/modules/myModule.js. 所以在这种情况下,我实际上确实希望 TypeScriptnode_modules在其输入文件中包含该目录。不过,我似乎缺少一些基本的东西,因为 TypeScript 实际上默认忽略了这个目录。
我的场景是否是包含node_modules目录的合法场景,如果是,我如何让 TypeScript 在我刚运行时将它包含在转译中tsc(因此它将使用我的tsconfig.json文件)?
更新:
我发现我可以node_modules通过将它显式地放在include指令中来使它包含我的目录,.tsconfig.json如下所示:
"include": [
"./src/node_modules/**/*",
"./src/**/*"
]
Run Code Online (Sandbox Code Playgroud)
问题仍然存在;我是否在这里遇到了根本性的错误,因为我必须覆盖默认情况下 TypeScript 排除的内容?我已经对此进行了测试,当我将其转换为 transpile 时node_modules,它确实正确地找到了我的本地模块。
包含在转译中是不正确的node_modules。因为node_modules包含 javascript 并且在 ts 库的情况下不需要第二次转译,所以它们应该在.d.ts.
如果您有自定义类型,或者您想将类型添加到一些没有它们的库中,则需要使用自己的声明或@types/*包。
在你的文件中,tsconfig.json你可以定义类型根(从哪里加载声明)。
{
"compilerOptions": {
"typeRoots": ["./declarations", "./node_modules/@types"],
"types": ["node"],
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以安装npm i --save-dev @types/node@^12例如获取nodejs v12的声明。
并定义您自己的声明,declarations例如express:./declarations/express/index.d.ts
{
"compilerOptions": {
"typeRoots": ["./declarations", "./node_modules/@types"],
"types": ["node"],
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8534 次 |
| 最近记录: |