【发布时间】:2022-02-07 11:50:23
【问题描述】:
我有一个基于 node express 的应用程序,带有以下 tsconfig:
{
"compilerOptions": {
"lib": [ "es6", "es2021", "esnext" ],
"target": "esnext",
"module": "es2022",
"composite": true,
"declaration": true,
"declarationMap": true,
"forceConsistentCasingInFileNames": true,
"importHelpers": true,
"newLine": "LF",
"noFallthroughCasesInSwitch": true,
"noImplicitReturns": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"preserveConstEnums": true,
"removeComments": true,
"resolveJsonModule": true,
"esModuleInterop": true,
"noImplicitAny": true,
"moduleResolution": "Node",
"sourceMap": false,
"rootDir": "./src",
"outDir": "./dist",
"baseUrl": "./src",
"paths": {
"*": [
"node_modules/*"
]
}
}, }
注意:将我的模块切换到 commonjs 不是一个灵魂,我希望它被构建为一个模块。
我在索引文件中的第一个本地文件导入时遇到错误,但它说它找不到的文件(找不到模块)确实存在,它有一个默认导出并且构建输出确实有一个 . d.ts 文件旁边还有一个类型导出。
我不知道为什么它不起作用。
错误:
Cannot find module 'workspace\dist\config\csrf' imported from workspace\dist\index.js
注意:我用工作区占位符替换了绝对路径。在这种情况下,我有一个文件:src/config/csrf.ts,它正在构建/转换为 dist/config/csrf.js,这一切似乎都在检查中,但它没有导入。
鉴于这是入口文件中的第一个本地文件导入,我假设所有其他文件都会遇到同样的问题。
发生了什么,在构建模块时我应该如何解析本地文件?
我的出口是这样的:
const csrf = () => {
// Code ommitted
}
export default csrf;
使用节点 ^16.13.2 和 TypeScript 4.5.6
编辑:我设置了以下脚本
"scripts": {
"clean": "rm -rf dist/",
"lint": "tslint -c tslint.json -p tsconfig.json --fix",
"tsc": "tsc",
"build": "npm run clean && npm run lint && npm run tsc",
"build:light": "npm run tsc",
"migrate:dev": "npx prisma migrate dev",
"migrate:prod": "npm run migrate:prod && npm run prisma:generate",
"dev:start": "npm run build && npm run start",
"dev:light": "npm run build:light && npm run start",
"dev": "nodemon --watch src -e ts,ejs --exec npm run dev:start",
"light": "nodemon --watch src -e ts,ejs --exec npm run dev:light",
"start": "node -r dotenv/config .",
"test": "echo \"Error: no test specified\" && exit 1"
},
并且在使用npm run dev或npm run light时出现错误。
请注意,TypeScript 编译正常,实际构建的 JavaScript 通过节点运行时会发生此错误。
编辑:我发现,如果我手动更新构建的 JavaScript 导入,它可以工作
例如:
import csrf from "./config/csrf";
更新到:
import csrf from "./config/csrf.js"
它突然起作用了,
什么鬼?我不应该手动更新我所有的转译文件,对吧?将 TypeScript 导入转换为兼容的 JavaScript 导入的正确方法是什么?
这看起来非常复杂且不必要。我错过了什么?在 TypeScript 中的导入上使用“.js”是零意义的,这样构建的输出才会真正运行
【问题讨论】:
标签: node.js typescript node-modules