pnpm 的 workspace
根目录的包管理
上一章 我们学到了在 pnpm 的 workspace 的根目录安装依赖的命令的是在pnpm add
后面加入 -w
子项目的包管理
为指定模块安装外部依赖。
在 workspace 模式下,pnpm 主要通过 —filter 选项过滤子模块
指定内部模块之间的互相依赖
参考官网的 Workspace 协议说明。我们内部使用 shared
时给 react
添加 dependencies
在实际发布 npm 包时,workspace:* 会被替换成内部模块 b 的对应版本号。替换结果如下所示:
react 包中jsx 的实现
我们先来看一下现有的 react 和对 jsx 的转换
首先创建一个 react-app
修改 index.js
结果如下图所示
所以最终我们的 react 导出一个 createElement 方法,jsx 接收两个参数,type 和 config。最终返回一个 ReactElement 包括 type,key,ref,props 等参数
最终初步实现的代码如下:
rollup 的配置
-
根据 官网教程 我们创建一个 react.config.mjs
文件.
-
我们需要根据包名获取当前的包路径,以及获取包的 package.json
的数据,我们写在 utils.js
中
-
因为我们的包是通过 ts 写的,所以需要引入 @rollup/plugin-typescript
插件。又因为我们的包里面没有写 module
或者 type
字段,所以还需要引入 @rollup/plugin-commonjs
插件来解析我们的包。rollup 的 plugins 字段应该是跟 webpack 的原理类似,都是在合适的时机解析包内容。
-
ES module 中不能直接使用 __dirname
,因为 ESM 设计上是静态的,在模块编译时确定就已经确定模块的依赖关系和输入输出变量,而 __dirname
和 __filename
提供的是运行时的路径信息,这与 ESM 的设计理念不符。所以需要使用 import.meta.url
来确定当前目录
最终实现的 react.config.mjs
代码如下
在 package.json
中添加命令后执行,生成 dist 文件夹
本地 react 项目验证我们的包
首先想到使用 npm 包本地调试的方法 npm link
。npm link
是一个 npm 命令,用于在本地开发 npm 包时,将本地的包目录链接到全局 node_modules 目录,或者将全局包链接到项目的 node_modules 目录。这样,你可以在不发布到 npm registry 的情况下,测试本地的包。
本地包链接到全局
当你正在开发一个本地包,并想要在其他项目中测试它时,可以使用以下步骤:
- 在本地包的根目录下运行
npm link
。这会在全局 node_modules 目录中创建一个符号链接,指向你的本地包。
- 在你的项目目录中,运行
npm link package-name
,其中 package-name
是你的本地包的名称。这会在项目的 node_modules 目录中创建一个符号链接,指向全局 node_modules 中的包。
这样,你对本地包所做的任何更改都会立即反映到使用该包的项目中,无需每次都重新发布和安装。
取消链接
当你完成测试,想要取消链接时,可以执行以下操作:
- 在项目目录中,运行
npm unlink package-name
来取消项目对本地包的链接。
- 在本地包的目录中,运行
npm unlink
来取消全局链接。
但是这里我们使用 pnpm link
。看下官方教程。我们可以直接在本地项目替换react 包,执行命令
重启服务npm start
。查看结果
取消 link 并不生效 查看 issue,通过下面方法重新加载官方 react 包