编辑
2024-11-21
学习
00
请注意,本文编写于 51 天前,最后修改于 47 天前,其中某些信息可能已经过时。

目录

vu3学习
一、monorepo开发环境搭建
1.初始化package.json
2.创建.npmrc文件(node-modules依赖平铺显示,方便引入)
3.创建packages文件夹
4.创建pnpm-workspace.yaml文件
二、开发环境搭建
1.安装依赖
2.生成tsconfig.json文件
3.创建scripts文件夹
4.在scripts文件夹下新建dev.js文件
5.新建reactivity文件夹
6.新建shared文件夹
7.修改package.json
8.修改dev.js
9.在reactivity和shared文件夹下均添加src/index.ts文件
10.再次修改dev.js

vu3学习

一、monorepo开发环境搭建

1.初始化package.json

js
pnpm init

2.创建.npmrc文件(node-modules依赖平铺显示,方便引入)

js
shamefully-hoist=true

3.创建packages文件夹

4.创建pnpm-workspace.yaml文件

yaml
packages: - "packages/*"

此时再去install vue就会出现错误

image.png

二、开发环境搭建

1.安装依赖

js
pnpm install typescript esbuild minimist -D -w

参数释义

  • typescript:语法提示
  • esbuild:打包
  • minimist:打包参数传递解析
  • -D:开发环境
  • -w:根目录

2.生成tsconfig.json文件

js
pnpm tsc --init

更改为以下配置

json
{ "compilerOptions": { "outDir": "dist", "sourceMap": true, "target": "ES2016", "module": "ESNext", "moduleResolution": "node", "strict": false, "resolveJsonModule": true, "esModuleInterop": true, "jsx": "preserve", "lib": ["ESNext","DOM"] } }

参数释义

  • outDir:输出目录
  • sourceMap:采用sourceMap
  • target:目标语法
  • module:模块格式
  • moduleResolution:模块解析方式
  • strict:严格模式
  • resolveJsonModule:解析json模块
  • esModuleInterop:允许通过es6语法引入commonjs模块
  • jsx
    不转义
  • lib:支持的类库

3.创建scripts文件夹

4.在scripts文件夹下新建dev.js文件

dev.js文件释义

这个文件会帮我们打包packages下的模块为js文件

5.新建reactivity文件夹

在packages文件夹下新建reactivity文件夹

6.新建shared文件夹

在packages文件夹下新建shared文件夹

7.修改package.json

找到"scripts": {}的位置添加

js
"scripts": { "dev":"node scripts/dev.js reactivity -f esm" }

相关信息

  • reactivity:需打包参数
  • -f:格式化分割
  • esm:打包格式

8.修改dev.js

js
import minimist from "minimist"; const args = minimist(process.argv.slice(2)); console.log(args);

如果出现报错

use import statement outside a module代表了不支持es6语法,需要在package.json中指定type为module

json
{ "name": "vue3-lesson", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "scripts": { "dev":"node scripts/dev.js reactivity -f esm" }, "keywords": [], "author": "", "license": "ISC" }

9.在reactivity和shared文件夹下均添加src/index.ts文件

10.再次修改dev.js

1.解构引用resove

js
import {resolve} from "path"; const entry = resolve(--dirname);

__dirname在es6中是不存在的,上述写法不能用。

  1. 结构引用fileURLToPath
js
import { fileURLToPath } from "url";
  1. 创建__filename变量获取文件绝对路径并获取文件夹
js
const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); console.log(__dirname,__filename);

也可以通过require获取

js
import { createRequire } from "module"; const require = createRequire(import.meta.url); console.log(require);
js
import minimist from "minimist"; const args = minimist(process.argv.slice(2)); console.log(args); 4.获取入口文件 ```js const entry = resolve(__dirname,`../packages/${target}$/src/index.ts`);

5.在reactivity和shared的src文件夹下创建package.json文件 添加配置

json
{ "name":"@vue/reactivity", "version": "1.0.0", "module": "dist/reactivity.esm-bundler.js", "unpkg":"dist/reactivity.global.js", "buildOptions": { "name": "VueReactivity", "formats": [ "esm-bundler", "esm-browser", "cjs", "global" ] } }
json
{ "name":"@vue/shared", "version": "1.0.0", "module": "dist/shared.esm-bundler.js", "buildOptions": { "name": "VueReactivity", "formats": [ "esm-bundler", "cjs" ] } }

属性释义

  • name: 包的名称,这里是 @vue/reactivity。
  • version: 包的版本号,这里是 1.0.0。
  • module: 指定了模块化的构建文件,这里是 dist/reactivity.esm-bundler.js,表示这是一个适用于 ES 模块和 bundler(如 webpack)的构建版本。
  • unpkg: 指定了在 unpkg CDN 上使用的构建文件,这里是 dist/reactivity.global.js,表示这是一个全局构建版本,可以直接在浏览器中使用。
  • buildOptions: 一个对象,包含了构建相关的选项。
  • name: 构建时使用的全局变量名,这里是 VueReactivity。
  • formats: 一个数组,列出了构建时支持的格式,包括:
  • esm-bundler: 适用于 bundler 的 ES 模块格式。
  • esm-browser: 适用于浏览器的 ES 模块格式。
  • cjs: 通用 JavaScript 模块(CommonJS)格式。
  • global: 全局变量格式,适用于直接在浏览器中通过

6.编辑shared/src目录下的index.ts文件

1.编写示例函数

js
export function isObject(value) { return typeof value === 'object' && value !== null; }

2.在reactivity/src/index.ts中调用

js
import { isObject } from "../../shared/src";

这样引用,万一文件夹路径改变就会报错了。

7.编辑tsconfig.json

添加baseUrl以及paths

js
{ "compilerOptions": { "outDir": "dist", "sourceMap": true, "target": "ES2016", "module": "ESNext", "moduleResolution": "node", "strict": false, "resolveJsonModule": true, "esModuleInterop": true, "jsx": "preserve", "lib": ["ESNext","DOM"], "baseUrl": ".", "paths": { "@vue/*":["packages/*/src"] } } }

8.命令行测试将@vue/shared安装到@vue/reactivity下

js
pnpm install @vue/shared --workspace --filter @vue/reactivity

注:必须加上 --workspace,否则会安装第三方的库

9.修改dev.js

添加

js
const pkg = require(`../packages/${target}/package.json`); esbuild.context({ entryPoints: [entry], outfile: resolve(__dirname, `../packages/${target}/dist/${target}.js`), bundle: true, platform: "browser", SourceMap: true, format, globalName: pkg.buildOptions?.name }).then(() => { console.log("start dev"); return ctx.watch(); });

属性释义

  • entryPoints:入口
  • outfile:出口
  • bundle:打包到一起
  • platform:打包后给浏览器使用
  • sourcemap:可以调试源代码
  • format:格式->cjs esm life
  • golobalName:参数名
  • ctx.watch:监控入口文件持续进行打包处理
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:wjc

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 ‌CC BY-NC 许可协议。转载请注明出处!