Node.js TypeScript Rollup构建报错:Unexpected token问题求助
问题详情
环境信息
- NodeJS: v18.7.0
- NPM: 8.15.0
配置文件
rollup.config.js:
import typescript from '@rollup/plugin-typescript'; import dts from 'rollup-plugin-dts'; import tsConfig from './tsconfig.json'; const config = [ { input: "index.ts", output: [{ file: "build/index.js", sourcemap: true }], plugins: [ typescript( { sourceMap: tsConfig.compilerOptions.sourceMap } ) ] }, { input: 'build/index.d.ts', output: [{ file: "build/index.d.ts", "format": "es" }], plugins: [ dts( { compilerOptions: { baseUrl: tsConfig.compilerOptions.baseUrl } } ) ] }, ] export default config;
tsconfig.json:
{ "compilerOptions": { "plugins": [ { "name": "@rollup/plugin-typescript" } ] } }
package.json:
{ "devDependencies": { "@rollup/plugin-typescript": "^8.3.4", "rollup": "^2.77.2", "rollup-plugin-dts": "^4.2.2", "ts-node": "^10.9.1", "tslib": "^2.4.0", "typescript": "^4.7.4" } }
构建报错信息
执行npm run build命令(先执行tsc --project tsconfig.build.json编译,再执行rollup -c)后,输出如下:
index.ts → build/index.js... (!) 未解析的依赖项 https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency url(由index.ts导入) path(由index.ts导入) http-errors(由index.ts导入) express(由index.ts、routes/index.ts、routes/healthchecks.ts、routes/api.ts导入) compression(由index.ts导入) helmet(由index.ts导入) cors(由index.ts导入) cookie-parser(由index.ts导入) morgan(由index.ts导入) [!] 错误:Unexpected token(请注意:导入非JavaScript文件需要插件) ../infrastructure/db.ts (5:9) 3: import config from 'config' 4: export class Database { 5: private static _pool: Pool; ^ 6: static init() { 7: try { Error: Unexpected token(请注意:导入非JavaScript文件需要插件) at error (/usr/src/Node.JSRestAPI/node_modules/rollup/dist/shared/rollup.js:198:30) at Module.error (/usr/src/Node.JSRestAPI/node_modules/rollup/dist/shared/rollup.js:12543:16) at Module.tryParse (/usr/src/Node.JSRestAPI/node_modules/rollup/dist/shared/rollup.js:12920:25) at Module.setSource (/usr/src/Node.JSRestAPI/node_modules/rollup/dist/shared/rollup.js:12825:24) at ModuleLoader.addModuleSource (/usr/src/Node.JSRestAPI/node_modules/rollup/dist/shared/rollup.js:22267:20) npm ERR! 生命周期脚本`rollup`执行失败: npm ERR! 错误:命令执行失败 npm ERR! 工作区:webapi@1.0.0 npm ERR! 位置:/usr/src/Node.JSRestAPI/src/webapi npm ERR! 生命周期脚本`build`执行失败: npm ERR! 错误:命令执行失败 npm ERR! 工作区:webapi@1.0.0 npm ERR! 位置:/usr/src/Node.JSRestAPI/src/webapi
解决方案
1. 完善TypeScript配置文件
当前tsconfig.json配置过于简略,没有覆盖上级目录的TS文件,也缺少必要编译规则。修改为如下内容:
{ "compilerOptions": { "target": "ES2020", "module": "ESNext", "outDir": "./build", "rootDir": "./", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "sourceMap": true, "baseUrl": "./", "paths": { "*": ["node_modules/*", "../*"] } }, "include": ["**/*.ts", "../infrastructure/**/*.ts"], "exclude": ["node_modules", "build"] }
include字段明确包含上级目录infrastructure下的所有TS文件,确保TypeScript能识别并编译它们paths配置让TS能正确解析跨目录的模块引用
2. 调整Rollup配置,添加依赖解析插件
Rollup默认不支持Node.js模块解析规则,需要添加插件处理第三方依赖和内置模块:
第一步:安装必要插件
npm install @rollup/plugin-node-resolve @rollup/plugin-commonjs --save-dev
第二步:修改rollup.config.js
import typescript from '@rollup/plugin-typescript'; import dts from 'rollup-plugin-dts'; import resolve from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import tsConfig from './tsconfig.json'; const config = [ { input: "index.ts", output: [{ file: "build/index.js", sourcemap: true, format: "cjs" }], plugins: [ resolve({ preferBuiltins: true }), // 解析Node.js内置模块和第三方包 commonjs(), // 转换CommonJS模块为ES模块 typescript({ tsconfig: './tsconfig.json', // 直接使用完整的TS配置文件 sourceMap: tsConfig.compilerOptions.sourceMap }) ] }, { input: 'build/index.d.ts', output: [{ file: "build/index.d.ts", "format": "es" }], plugins: [ dts({ compilerOptions: { baseUrl: tsConfig.compilerOptions.baseUrl } }) ] }, ] export default config;
- 添加
resolve和commonjs插件解决未解析依赖的警告 - 让
typescript插件直接读取完整的TS配置,确保所有TS文件都被正确编译
3. 检查tsconfig.build.json配置
如果项目中存在tsconfig.build.json,需要确保它的include字段同样包含../infrastructure/**/*.ts,保持和主TS配置一致,避免tsc编译后Rollup还要处理未编译的TS文件。
4. 安装缺失的生产依赖
报错中提到的未解析依赖(express、compression等)都是生产环境需要的包,需要安装:
npm install express compression helmet cors cookie-parser morgan http-errors config --save
同时安装对应的类型声明包(可选但推荐):
npm install @types/express @types/compression @types/helmet @types/cors @types/cookie-parser @types/morgan @types/http-errors @types/config --save-dev
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

