You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:03:24