使用Vite创建TypeScript库遇导入错误:TypeError: au.release is not a function
- 该错误的来源是什么?
- 为何在库中导入第三方依赖时会出现此错误?
- 如何将自定义库导出到其他项目且不导致项目运行异常?
注:这是我首次创建库,存在诸多未知,推测问题出在TypeScript、Vite或package.json的配置中,但无法确定具体环节。
导入自定义库后,项目代码无法编译,报错TypeError: au.release is not a function。查看编译后的代码,错误出现在执行<tag>.release().split(".")(共6处)或au.release().toLowerCase().includes("microsoft")(1处)的位置,相关代码片段如下:
if (process.platform === "win32") { var Au = au.release().split("."); return Number(process.versions.node.split(".")[0]) >= 8 && Number(Au[0]) >= 10 && Number(Au[2]) >= 10586 ? Number(Au[2]) >= 14931 ? 3 : 2 : 1; }
该错误仅在库中包含导入第三方依赖的函数时出现。例如,导出以下含axios依赖的dosAttack函数时,必然触发错误,但库自身编译构建无异常:
import axios from "axios"; export async function dosAttack( url: string, qty: number, ms: number ): Promise<{ err: number; pass: number }[]> { const result: { err: number; pass: number }[] = []; for (let time = 0; time < qty; time++) { const requests = []; let err = 0; let pass = 0; for (let attack = 0; attack < qty; attack++) { requests.push( axios .get(url) .then(() => pass++) .catch(() => err++) ); } await Promise.all(requests); console.log({ err, pass }); result.push({ err, pass }); await new Promise((resolve) => setTimeout(resolve, ms)); } return result; }
无第三方依赖的函数可正常导出使用。以下是库的配置文件:
vite.config.ts
// vite.config.js import { resolve } from "path"; import { defineConfig } from "vite"; import dts from "vite-plugin-dts"; import viteTsconfigPaths from "vite-tsconfig-paths"; const packageName = "qa-library"; export default defineConfig({ base: "", plugins: [ viteTsconfigPaths(), dts({ insertTypesEntry: true, }), ], build: { lib: { entry: resolve(__dirname, "src/index.ts"), name: packageName, fileName: "index", formats: ["es", "cjs"], }, emptyOutDir: false, }, resolve: { alias: { lib: "/src", enums: "/src/enums", interface: "/src/interface", service: "/src/service", }, }, });
tsconfig.json
{ "compilerOptions": { "target": "ESNext", "lib": ["ESNext"], "types": ["vite/client", "node"], // "allowJs": false, "skipLibCheck": true, // "esModuleInterop": false, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "CommonJS", "moduleResolution": "Node", "resolveJsonModule": true, // "isolatedModules": true, "noEmit": true, "baseUrl": "./", "paths": { "@/*": ["./src/*"], "lib/*": ["./src/*"], "enums/*": ["./src/enums/*"], "interface/*": ["./src/interface/*"], "service/*": ["./src/service/*"] } }, "include": ["./src"], "exclude": ["node_modules"] }
package.json
{ "name": "qa-library", "private": false, "version": "0.1.303", "type": "module", "exports": { ".": { "import": "./dist/index.js", "require": "./dist/index.cjs", "types": "./dist/index.d.ts" } }, "main": "./dist/index.cjs", "module": "./dist/index.js", "typings": "./dist/index.d.ts", "files": [ "/dist/*" ], "scripts": { "dev": "vite", "build": "tsc && vite build", "preview": "vite preview" }, "devDependencies": { "@rollup/plugin-typescript": "^8.5.0", "@types/node": "^18.18.5", "prettier": "2.6.2", "rollup-plugin-typescript-paths": "^1.5.0", "tslib": "^2.7.0", "typescript": "^5.5.3", "vite": "^5.4.1" }, "dependencies": { "@faker-js/faker": "^8.4.1", "@playwright/test": "^1.47.0", "@standardsdigital/qa-library": "^0.1.302", "axios": "^1.7.7", "moment": "^2.30.1", "vite-plugin-dts": "^4.2.1", "vite-tsconfig-paths": "^4.2.3" } }
1. 错误来源分析
报错里的au是Node.js内置os模块的拼写错误(正确应为os.release()),但这个错误并非你的代码导致——它来自第三方依赖的打包产物。当Vite构建库时,默认会把第三方依赖打包进你的库文件,而某个依赖(比如axios或其嵌套依赖)在编译压缩过程中出现了变量名冲突,导致os被错误替换成au,最终运行时找不到release()方法。
2. 导入第三方依赖时触发错误的原因
当前Vite配置会将所有第三方依赖打包进库文件,而不是让宿主项目自行安装这些依赖。这种做法会带来两个问题:
- 依赖中若包含Node.js环境专属代码(比如
os模块),在浏览器或非Node环境的宿主项目中运行时,不仅会出现变量错误,还会因为缺少内置模块而报错; - 打包依赖会导致库体积暴涨,还容易和宿主项目的依赖版本产生冲突。
3. 修复步骤
步骤1:调整Vite配置,排除第三方依赖
修改vite.config.ts的build选项,添加rollupOptions.external,将第三方依赖标记为外部依赖,让宿主项目自行安装:
// vite.config.ts export default defineConfig({ // ...其他原有配置 build: { lib: { // ...已有配置 }, emptyOutDir: false, rollupOptions: { // 自动读取package.json中的依赖并标记为外部依赖 external: Object.keys(require('./package.json').dependencies), // 也可以手动指定:external: ['axios', '@faker-js/faker', '@playwright/test', 'moment'] } }, });
步骤2:修正package.json的依赖分类
将仅用于构建的插件移到devDependencies,避免宿主安装不必要的包:
vite-plugin-dts和vite-tsconfig-paths是构建工具插件,属于开发依赖,移到devDependencies;- 移除
@standardsdigital/qa-library(看起来是你自己的库,属于误加的依赖)。
调整后的依赖部分:
"devDependencies": { "@rollup/plugin-typescript": "^8.5.0", "@types/node": "^18.18.5", "prettier": "2.6.2", "rollup-plugin-typescript-paths": "^1.5.0", "tslib": "^2.7.0", "typescript": "^5.5.3", "vite": "^5.4.1", "vite-plugin-dts": "^4.2.1", "vite-tsconfig-paths": "^4.2.3" }, "dependencies": { "@faker-js/faker": "^8.4.1", "@playwright/test": "^1.47.0", "axios": "^1.7.7", "moment": "^2.30.1" }
步骤3:修正TypeScript配置
你的tsconfig.json中module设置为CommonJS,但package.json的type是module,存在模块系统冲突。修改tsconfig.json的compilerOptions:
"module": "ESNext", "moduleResolution": "NodeNext", "isolatedModules": true,
开启isolatedModules可确保TypeScript与Vite的编译逻辑一致,避免类型校验和实际编译结果不匹配。
步骤4:重新构建并验证
执行npm run build重新构建库,本地测试可使用npm link将库链接到宿主项目,验证是否正常运行。确认无误后再发布到npm或私有仓库。
额外提示
- 若你的库需要在浏览器环境运行,要确保依赖的第三方包支持浏览器环境(比如axios支持,但
@playwright/test是Node端测试工具,在浏览器中会报错,需谨慎使用); - 发布前可检查
dist目录下的产物,确保没有包含第三方依赖的代码。
内容的提问来源于stack exchange,提问作者Raitis Lebedevs

