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

使用Vite构建Node.js应用时AsyncLocalStorage导出报错问题

解决Vite构建Node.js应用时AsyncLocalStorage导出错误的问题

开发Node.js应用时使用Vite构建,代码中引入node:async_hooks的AsyncLocalStorage,开发模式正常,但构建时报错:

"AsyncLocalStorage" is not exported by "__vite-browser-external", imported by [path name]

问题原因

Vite默认构建目标为浏览器环境,会自动将node:*这类Node.js内置模块标记为浏览器外部依赖(通过__vite-browser-external),但AsyncLocalStorage是Node.js专属API,不存在浏览器兼容实现,因此构建阶段无法找到对应导出。

解决方案

1. 配置Vite以Node.js为构建目标

修改vite.config.ts,明确指定构建目标为Node.js环境,同时调整Rollup配置避免错误外部化Node内置模块:

import { defineConfig } from "vite";

export default defineConfig({
  plugins: [],
  build: {
    // 根据你的Node版本选择,比如node18/node20
    target: "node18",
    rollupOptions: {
      input: "./index.js",
      // 取消默认的Node模块外部化
      external: [],
      // 输出适合Node.js的格式,可选cjs或esm
      output: {
        format: "cjs"
      }
    },
    // 禁用浏览器特有的模块预加载polyfill
    polyfillModulePreload: false
  },
  // 确保Node模块不被外部化处理
  ssr: {
    noExternal: true
  }
});

2. 可选:添加环境兼容判断(若需跨环境运行)

如果你的应用可能在浏览器环境加载,需对AsyncLocalStorage做环境判断,避免浏览器端报错:

let asyncLocalStorage;
// 判断当前是否为Node.js环境
if (typeof process !== 'undefined' && process.versions.node) {
  const { AsyncLocalStorage } = require('node:async_hooks');
  asyncLocalStorage = new AsyncLocalStorage();
} else {
  // 浏览器环境下提供空实现或替代逻辑
  asyncLocalStorage = {
    run: (store, callback) => callback(),
    getStore: () => null
  };
}

asyncLocalStorage.run(new Map(), () => {
  asyncLocalStorage.getStore()?.set("requestid", "45");
});

3. 为什么rollup-plugin-node-polyfills无效?

该插件仅能为浏览器环境提供部分Node核心模块的polyfill,但AsyncLocalStorage是Node.js独有的异步上下文管理API,没有对应的浏览器原生或polyfill实现,因此无法通过该插件解决问题。

内容的提问来源于stack exchange,提问作者sara khosropour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:01:12