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

使用Vite创建TypeScript库遇导入错误:TypeError: au.release is not a function

问题
  1. 该错误的来源是什么?
  2. 为何在库中导入第三方依赖时会出现此错误?
  3. 如何将自定义库导出到其他项目且不导致项目运行异常?

注:这是我首次创建库,存在诸多未知,推测问题出在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:07:02