[ Element plus源码笔记一(架构) | 青训营笔记]

425 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 四 天

一、项目依赖

第一步先去看项目的依赖有哪些

package.json

{
  "private": true,
  "packageManager": "pnpm@7.3.0",
  "workspaces": [
    "packages/*",
    "play",
    "docs"
  ],
  "scripts": {
    "cz": "czg",
    "test": "vitest",
    "test:coverage": "vitest --coverage",
    "test:ssr": "vitest --config ./ssr-testing/vitest.config.ts",
    "prepare:e2e": "if [ ! -d \"docs/.vitepress/dist\" ]; then pnpm run docs:build; fi;",
    "dev": "pnpm -C play dev",
    "gen": "bash ./scripts/gc.sh",
    "gen:version": "tsx scripts/gen-version.ts",
    "diff:table": "tsx scripts/build-table.ts",
    "update:version": "tsx scripts/update-version.ts",
    "clean": "pnpm run clean:dist && pnpm run -r --parallel clean",
    "clean:dist": "rimraf dist",
    "build": "pnpm run -C internal/build start",
    "build:theme": "pnpm run -C packages/theme-chalk build",
    "format": "prettier --write --cache .",
    "lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx,.md,.json --max-warnings 0 --cache",
    "lint:fix": "pnpm run lint --fix",
    "lint:commit": "commitlint --from $(git merge-base origin/dev HEAD) --to HEAD > ./commit-lint.txt",
    "typecheck": "run-p typecheck:web typecheck:play typecheck:node typecheck:vite-config typecheck:vitest",
    "typecheck:web": "vue-tsc -p tsconfig.web.json --composite false --noEmit",
    "typecheck:node": "tsc -p tsconfig.node.json --noEmit",
    "typecheck:play": "vue-tsc -p tsconfig.play.json --composite false --noEmit",
    "typecheck:vite-config": "vue-tsc -p tsconfig.vite-config.json --composite false --noEmit",
    "typecheck:vitest": "vue-tsc -p tsconfig.vitest.json --composite false --noEmit",
    "docs:dev": "pnpm run -C docs dev",
    "docs:build": "pnpm run -C docs build",
    "docs:serve": "pnpm run -C docs serve",
    "docs:gen-locale": "pnpm run -C docs gen-locale",
    "docs:crowdin-credentials": "pnpm run -C docs crowdin-credentials",
    "stub": "pnpm run -r --parallel stub",
    "prepare": "husky install",
    "postinstall": "pnpm stub && concurrently \"pnpm gen:version\" \"pnpm run -C internal/metadata dev\""
  },
  "peerDependencies": {
    "vue": "^3.2.0"
  },
  "dependencies": {
    "@element-plus/components": "workspace:*",
    "@element-plus/constants": "workspace:*",
    "@element-plus/directives": "workspace:*",
    "@element-plus/hooks": "workspace:*",
    "@element-plus/icons-vue": "^2.0.6",
    "@element-plus/locale": "workspace:*",
    "@element-plus/test-utils": "workspace:*",
    "@element-plus/theme-chalk": "workspace:*",
    "@element-plus/tokens": "workspace:*",
    "@element-plus/utils": "workspace:*",
    "@floating-ui/dom": "^1.0.1",
    "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
    "@types/lodash": "^4.14.182",
    "@types/lodash-es": "^4.17.6",
    "@vueuse/core": "^9.1.0",
    "async-validator": "^4.2.5",
    "dayjs": "^1.11.3",
    "escape-html": "^1.0.3",
    "lodash": "^4.17.21",
    "lodash-es": "^4.17.21",
    "lodash-unified": "^1.0.2",
    "memoize-one": "^6.0.0",
    "normalize-wheel-es": "^1.2.0"
  },
  "devDependencies": {
    "@commitlint/cli": "^17.0.3",
    "@commitlint/config-conventional": "^17.0.3",
    "@element-plus/build": "workspace:^0.0.1",
    "@element-plus/build-utils": "workspace:^0.0.1",
    "@element-plus/eslint-config": "workspace:*",
    "@esbuild-kit/cjs-loader": "^2.2.1",
    "@pnpm/find-workspace-packages": "^4.0.16",
    "@pnpm/logger": "^4.0.0",
    "@pnpm/types": "^8.4.0",
    "@types/fs-extra": "^9.0.13",
    "@types/gulp": "^4.0.9",
    "@types/jsdom": "^16.2.14",
    "@types/node": "*",
    "@types/sass": "^1.43.1",
    "@vitejs/plugin-vue": "^2.3.3",
    "@vitejs/plugin-vue-jsx": "^1.3.10",
    "@vitest/ui": "0.16.0",
    "@vue/test-utils": "^2.0.0",
    "@vue/tsconfig": "^0.1.3",
    "c8": "^7.11.3",
    "chalk": "^5.0.1",
    "concurrently": "^7.2.2",
    "consola": "^2.15.3",
    "csstype": "^2.6.20",
    "cz-git": "^1.3.8",
    "czg": "^1.3.8",
    "eslint": "^8.18.0",
    "eslint-define-config": "^1.5.1",
    "expect-type": "^0.13.0",
    "fast-glob": "^3.2.11",
    "husky": "^8.0.1",
    "jsdom": "16.4.0",
    "lint-staged": "^13.0.3",
    "npm-run-all": "^4.1.5",
    "prettier": "^2.7.1",
    "puppeteer": "^17.1.3",
    "resize-observer-polyfill": "^1.5.1",
    "rimraf": "^3.0.2",
    "sass": "^1.53.0",
    "ts-morph": "^14.0.0",
    "tsx": "^3.6.0",
    "type-fest": "^2.14.0",
    "typescript": "^4.7.4",
    "unplugin-element-plus": "^0.4.0",
    "unplugin-vue-macros": "^0.11.2",
    "vitest": "0.12.6",
    "vue": "^3.2.37",
    "vue-router": "^4.0.16",
    "vue-tsc": "^0.38.2"
  },
  "engines": {
    "node": ">= 16"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-git"
    }
  },
  "pnpm": {
    "peerDependencyRules": {
      "ignoreMissing": [
        "vite",
        "react",
        "react-dom"
      ]
    }
  },
  "lint-staged": {
    "*.{vue,js,ts,jsx,tsx,md,json}": "eslint --fix"

主要的依赖有(记录的是新学习的依赖):

1.yarn的workplace:这可以创建把三个文件夹分别创建成三个不同的工作环境packages,play,docs 可以解决项目依赖的相关问题。一次install就可以将所有工作区的依赖全部打包,工作区之间也可以相互依赖 项目内部还有使用pnpm的workspace,本人也还搞不清楚为什么存在两个。。。。

  "workspaces": [
    "packages/*",
    "play",
    "docs"
  ],

2.test测试的部分,使用的是vitest+vue-util-test。两者结合的基本使用方式,可以参考我前面的文章

"scripts": { "...", "test": "vitest","..."}
"devDependencies": { "...","@vitest/ui": "0.16.0", "@vue/test-utils": "^2.0.0","..."}

3.jsdom 这个也是与测试的模块相辅相成的,jsdom 是许多 Web 标准的纯 JavaScript 实现。他可以模拟网页的可视化元素,例如下面代码:官方文档(github.com/jsdom/jsdom…

const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"

4.husky是和commitlint搭配使用。一起对提交(commit)的动作进行审核。husky 是一个 Git Hook 工具。husky 其实就是一个为 git 客户端增加 hook 的工具。比如在 commit stage执行的命令可以挪动到本地执行,比如 lint 检查、比如单元测试。官方文档(typicode.github.io/husky/#/) 而commitlint主要作用是检查commit时提交的信息是否规范进行一个审核[他们真的很严格,我哭死]。官方文档(github.com/conventiona…

"devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3",

二、项目目录

1.husky存放的是husky配置信息

2.docs是使用vitepress来配置和生成项目文档的文件夹

3.internal是项目构建(build)相关的配置

4.packages[重点]是装载所有组件的源码,他们的测试,渲染模板,钩子等等

5.play是提供组件一个实际在项目测试组件的环境,一般组件库命名规则里会命名为example

6.ssr-testing是提供ssr进行测试的一个环境

7.typings主要是全局组件,开发环境,测试环境的一些ts的类型配置

捕获.JPG