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

如何基于环境导出shared库不同构建产物且支持统一子路径导入?

该需求完全可以实现,优先推荐使用Node.js与主流构建工具原生支持的条件导出方案,无需手写判断逻辑,也不需要上层业务项目做额外适配。

方案1:package.json 条件导出(标准方案)

现在Node.js 12+、webpack 5、Vite、Rollup等所有主流工具都原生支持package.json的exports字段,可以根据运行环境自动匹配导出路径,你只需要在shared库的package.json中增加如下配置即可:

{
  "name": "shared",
  "exports": {
    // 匹配所有子路径导入
    "./*": {
      // Node 环境自动映射到 node 目录
      "node": "./node/*",
      // 浏览器环境自动映射到 es 目录
      "browser": "./es/*",
      // 兜底规则
      "default": "./es/*"
    }
  }
}

配置完成后,你写import {isEmpty} from 'shared/utils/lodashAlternative'时,工具会自动根据环境匹配对应目录的文件,完全符合你的使用要求。

方案2:上层项目构建插件重定向(兼容旧构建工具)

如果你使用的是不支持exports字段的旧版本构建工具,可以在上层项目的构建配置中加路径替换规则:

  • webpack 配置示例:
const webpack = require('webpack')
module.exports = {
  plugins: [
    new webpack.NormalModuleReplacementPlugin(/^shared\/(.*)$/, (resource) => {
      const subPath = resource.request.match(/^shared\/(.*)$/)[1]
      resource.request = process.env.SERVER ? `shared/node/${subPath}` : `shared/es/${subPath}`
    })
  ]
}
  • Vite 配置示例:
export default defineConfig({
  resolve: {
    alias: [
      {
        find: /^shared\/(.*)$/,
        replacement: process.env.SERVER ? 'shared/node/$1' : 'shared/es/$1'
      }
    ]
  }
})
方案3:库端自动生成重定向文件(无依赖方案)

如果不希望依赖上层项目的配置,你可以写一个简单的脚本,遍历shared/es目录下的所有文件,在对应路径生成重定向文件,比如shared/utils/lodashAlternative.js的内容如下:

module.exports = process.env.SERVER 
  ? require('../es/utils/lodashAlternative') 
  : require('../node/utils/lodashAlternative')

这种方案仅支持CommonJS规范的导入,不支持ES模块静态导入,适合全CommonJS的项目使用。

注意:你最开始写的根目录index.js判断逻辑,仅能处理根目录导入的场景,无法处理子路径导入,所以不适用你的需求。

内容的提问来源于stack exchange,提问作者Andrii Radkevych

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:18:02