UzumakiItachi
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

UzumakiItachi

起风了,唯有努力生存。
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • WebPack

  • 浏览器相关

  • 工程化相关

  • 工作中遇到的问题以及解决方案

    • 解决浏览器返回页面不刷新的问题
    • 前端如何下载文件流
    • uniapp APP端实现更新最新安装包
    • GitHub Actions Process completed with exit code 128 的解决方案
    • 保留文字输入的空格和换行
    • 缩放适配大屏页
    • 一次性加载n多张图片的性能优化方案
    • NOT-Cool 低代码页面架构思路
    • h5下载vcard快捷保存联系人信息
    • 结合elementui实现的动态主题
    • 解决monorepo场景下子包作为依赖项在开发和生产暴露文件的问题
      • 前言
      • 问题解析
      • 解决办法
        • 解决办法一
        • 解决办法二
      • 总结
    • 给npm配置github令牌
    • 移动端电子印章解决方案
    • 小程序canvas绘制海报中遇到的一些坑
    • 超详细的虚拟列表实现过程
    • 小程序实现一个事件中心
    • 请求超时后如何优雅的重新请求
    • 超详细的大文件上传实现方案
    • 仿抖音短视频组件实现方案
    • swiper渲染大量数据的优化方案
    • 前端检测更新,自动刷新网页
  • Git

  • Vite

  • 一些小工具

  • 算法

  • 服务器

  • HTTP

  • 技术
  • 工作中遇到的问题以及解决方案
hanhanbuku
2023-09-14
目录

解决monorepo场景下子包作为依赖项在开发和生产暴露文件的问题

# 前言

在monorepo场景下包和包之间相互存在依赖关系是很常见的问题,但这同样会暴露出一个问题:代码上线之后我们肯定是将打包好的代码发布到npm上而不会将全部源码发布上去,那么问题来了,子包的package.json里的暴露项配置我们到底是配置打包后的目录还是配置源码目录呢?

# 问题解析

产生这个问题的原因很简单,就是生产阶段引用的是打包后的代码,而本地开发阶段需要的是实时更新的代码,也就是我们的源码。如何在这两者之间做好权衡是monorepo架构必须考虑的一个问题

# 解决办法

首先正常情况下,我们配置子包会这么配

  "exports": {
    ".": {
      "import": "./dist/index.js",
      "require": "./dist/index.cjs"
    },
  },
1
2
3
4
5
6

这样配置指向我们dist文件,也就是构建后的文件。这样开发者在使用这个包的时候直接用包名引入就会链到dist文件夹里去。 但是很明显, 这样的配置是无法满足我们的开发阶段的。开发阶段需要引入的肯定是源码,而不是构建后的产物,不然每改动一下就要重新构建子包,这不是纯找罪受吗?

# 解决办法一

暴露多条链路,使用方根据环境不同重写引入的别名。

// 子包的package.json

"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs"
},
"./src/index": "./src/index.ts" 
},
1
2
3
4
5
6
7
8
9

可以看到,我们在子包中既配置了dist目录暴露出去同时也配置了源码路径暴露出去,这个时候主包需要通过别名来重写引入路径达到目的

// 主包 vite.config.js

resolve: {
    alias: {
        '@': path.join(__dirname, './src'),
        '@itachi3/nc-h5-components': isProduction ? '@itachi3/nc-h5-components' : '@itachi3/nc-h5-components/src/index', // 兼容本地和开发环境
        '@itachi3/ncaxios': isProduction ? '@itachi3/ncaxios' : '@itachi3/ncaxios/src/index',
    },
},
1
2
3
4
5
6
7
8
9

通过这样配置之后,开发环境我们使用的源码,而生产环境则就会使用构建后的产物。

# 解决办法二

同样也是改写package.json,但这个方法是通过脚本的形式去改,让子包在build阶段去自动的把暴露项修改成构建产物

// util/update_package.js
const { readFileSync, writeFileSync } = require('fs')
const path = require('path')
const pkgPath = path.resolve(__dirname, '../package.json')

const pkgContent = JSON.parse(readFileSync(pkgPath, 'utf8'))
pkgContent.exports = {
  '.': {
    import: './dist/index.js',
  },
  './styles': './dist/styles/index.css',
  './types': './dist/types/base.d.ts',
}

writeFileSync(pkgPath, JSON.stringify(pkgContent, '', '\t'), {
  encoding: 'utf8',
})
console.log('[package] 修改package.json 文件成功')

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

这样在每次build子包前执行一下这个命令,就可以了。主包无需做修改。

# 总结

两种解决办法都是需要修改子包的package.json,第一种方法利用了配置引入别名的优势,而第二种方法则是简单粗暴的去修改子包的暴露项。可自行选择使用哪种方法

编辑 (opens new window)
上次更新: 2024/01/08, 15:37:55
结合elementui实现的动态主题
给npm配置github令牌

← 结合elementui实现的动态主题 给npm配置github令牌→

最近更新
01
前端检测更新,自动刷新网页
06-09
02
swiper渲染大量数据的优化方案
06-06
03
仿抖音短视频组件实现方案
02-28
更多文章>
Theme by Vdoing | Copyright © 2023-2025 UzumakiItachi | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式