From 4167e2948177a008c834052a1a73560a8e360193 Mon Sep 17 00:00:00 2001 From: "13404213324@163.com" <13404213324@163.com> Date: Wed, 24 Nov 2021 14:02:22 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E5=91=A8=E7=AC=94?= =?UTF-8?q?=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\221\250\347\254\224\350\256\260.md" | 86 ++++++++++++++++++ docs/pages/pjj/README.md | 3 + ...1\345\235\227\345\205\263\347\263\273.png" | Bin 0 -> 35762 bytes 3 files changed, 89 insertions(+) create mode 100644 "docs/pages/pjj/01.\347\254\254\344\270\200\345\221\250\347\254\224\350\256\260.md" create mode 100644 docs/pages/pjj/README.md create mode 100644 "docs/pages/pjj/images/01_\351\241\271\347\233\256\346\250\241\345\235\227\345\205\263\347\263\273.png" diff --git "a/docs/pages/pjj/01.\347\254\254\344\270\200\345\221\250\347\254\224\350\256\260.md" "b/docs/pages/pjj/01.\347\254\254\344\270\200\345\221\250\347\254\224\350\256\260.md" new file mode 100644 index 0000000..f6cc72b --- /dev/null +++ "b/docs/pages/pjj/01.\347\254\254\344\270\200\345\221\250\347\254\224\350\256\260.md" @@ -0,0 +1,86 @@ +# 慕课乐高整体设计 + +## 需求分析 + +[慕课乐高需求文档](https://www.yuque.com/books/share/af79538c-09eb-4ddd-bfb7-599816c233bf) + +## 范围 + +架构设计,技术选型 + +## 模块设计 + +##### 模板作品创作平台 + +- 用途:模板作品创作者可以在此平台创作自己的 H5 海报模板 +- 开发方式:由 editor-fe 和 editor-server 的前后端分离模式进行开发 + +##### 模板作品展示 + +- 用途:普通用户查看的 H5 作品展示 +- 开发方式:由 SSR 模式开发的 H5 + +##### 模板作品管理 + +- 用途:后台管理人员管理模板作品等 +- 开发方式:由 admin-fe 和 admin-server 的前后端分离模式进行开发 + +![项目模块关](./images/01_项目模块关系.png) + +## 核心数据结构 + +##### 数据结构思路 + +- 每个组件尽量符合 vnode 规范 +- 用数组来组织数据,需要排序 +- 尽量使用引用关系,不要冗余 + +```js +{ + work: { + title: "作品标题", + setting: {}, // 一些可能的配置项 扩展性保证 + props: {}, // 页面的一些设置 扩展性保证 + components: [ + { + id: "1", + name: "文本1", + tag: "text", + attrs: { + fontSize: "20px", + }, + children: ["文本1"], + }, + { + id: "2", + name: "图片1", + tag: "image", + attrs: { + src: "xxx.png", + width: "120px", + }, + children: null, + }, + ], + }, +} +``` + +## 扩展性保证 + +- 扩展组件 +- 扩展编辑功能,如锁定,隐藏 +- 扩展页面信息,如多语言选择 +- 扩展其他功能,如大数据分析和计算 + +## 研发提效 + +- 用于创建和发布的脚手架 +- 公共组件库 + +## 运维保障 + +- 线上服务和运维服务 +- 安全 +- 监控和报警 +- 服务扩展性:基于云服务,可以随时扩展机器和配置 diff --git a/docs/pages/pjj/README.md b/docs/pages/pjj/README.md new file mode 100644 index 0000000..57a4ed6 --- /dev/null +++ b/docs/pages/pjj/README.md @@ -0,0 +1,3 @@ +# pjj - 学习记录 + +请直接看下级目录 diff --git "a/docs/pages/pjj/images/01_\351\241\271\347\233\256\346\250\241\345\235\227\345\205\263\347\263\273.png" "b/docs/pages/pjj/images/01_\351\241\271\347\233\256\346\250\241\345\235\227\345\205\263\347\263\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..4c7578ba7db981e557d9a0b6ccfb276485eef96f GIT binary patch literal 35762 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 literal 0 HcmV?d00001 From 3aaa606535bfad823c388220aac7e1a1f98f67cd Mon Sep 17 00:00:00 2001 From: "13404213324@163.com" <13404213324@163.com> Date: Mon, 29 Nov 2021 13:51:43 +0800 Subject: [PATCH 2/6] =?UTF-8?q?pjj=20=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\221\250\347\254\224\350\256\260.md" | 2 +- ...14\345\221\250\347\254\224\350\256\260.md" | 83 ++++++++++++++++++ ...7\350\241\214\345\216\237\347\220\206.png" | Bin 0 -> 8044 bytes 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 "docs/pages/pjj/02.\347\254\254\344\272\214\345\221\250\347\254\224\350\256\260.md" create mode 100644 "docs/pages/pjj/images/02_\350\204\232\346\211\213\346\236\266\346\211\247\350\241\214\345\216\237\347\220\206.png" diff --git "a/docs/pages/pjj/01.\347\254\254\344\270\200\345\221\250\347\254\224\350\256\260.md" "b/docs/pages/pjj/01.\347\254\254\344\270\200\345\221\250\347\254\224\350\256\260.md" index f6cc72b..4d6c7d5 100644 --- "a/docs/pages/pjj/01.\347\254\254\344\270\200\345\221\250\347\254\224\350\256\260.md" +++ "b/docs/pages/pjj/01.\347\254\254\344\270\200\345\221\250\347\254\224\350\256\260.md" @@ -25,7 +25,7 @@ - 用途:后台管理人员管理模板作品等 - 开发方式:由 admin-fe 和 admin-server 的前后端分离模式进行开发 -![项目模块关](./images/01_项目模块关系.png) +![项目模块关系](./images/01_项目模块关系.png "项目模块关系") ## 核心数据结构 diff --git "a/docs/pages/pjj/02.\347\254\254\344\272\214\345\221\250\347\254\224\350\256\260.md" "b/docs/pages/pjj/02.\347\254\254\344\272\214\345\221\250\347\254\224\350\256\260.md" new file mode 100644 index 0000000..dc8d8b4 --- /dev/null +++ "b/docs/pages/pjj/02.\347\254\254\344\272\214\345\221\250\347\254\224\350\256\260.md" @@ -0,0 +1,83 @@ +# 脚手架架构设计和框架搭建 + +## 脚手架核心价值 + +将研发过程: + +- 自动化:项目重复代码拷贝/git 操作/发布上线操作 +- 标准化:项目创建/git flow/发布流程/回滚流程 +- 数据化:研发过程系统化、数据化、使得研发过程可量化 + +## 和自动化构建工具区别 + +问题:jenkins、travis 等自动化构建工具已经比较成熟了,为什么还需要自研脚手架? + +- 不满足需求:jenkins、travis 通常再 git hooks 中触发,需要在服务端执行,无法覆盖研发人员本地的功能,如:创建项目自动化、本地 git 操作自动化等 +- 定制复杂:jenkins、travis 定制过程需要开发插件,其过程较为复杂,需要使用 Java 语言,对前端不够友好 + +## 脚手架简介 + +脚手架本质是一个操作系统的客户端,它通过命令行执行,比如: + +``` +vue create vue-test-app --force -r https://registry.npm.taobao.org +``` + +- 主命令:vue +- command:create +- command 的 param:vue-test-app +- options:--force 为配置项,默认参数为 true;-r 也为配置项,并且是--registry 的简写,https://registry.npm.taobao.org 为参数,且可以自定义配置项的参数个数 + +## 脚手架的执行原理 + +![脚手架的执行原理](./images/02_脚手架执行原理.png "脚手架的执行原理") + +执行顺序 + +- 在终端输入 vue create vue-test-app +- 终端解析 vue 命令 +- 终端在环境变量中找到 vue 命令 +- 终端根据 vue 命令链接到实际文件 vue.js +- 终端利用 node 执行 vue.js +- vue.js 解析 command/options +- vue.js 执行 command +- 执行完成,退出执行 + +## 脚手架实现原理 + +- 为什么全局安装 @vue/cli 后会添加的命令为 vue? + 根据 @vue/cli 的 package.json 文件中 bin 选项 + + ```json + "bin": { + "vue": "bin/vue.js" + }, + ``` + +
+ +- 全局安装 @vue/cli 时发生了什么? + 1.npm 将安装包 @vue/cli 下载至全局的 node_modules 中(可通过 npm root -g 查看安装位置) + 2.解析@vue/cli 的 package.json 文件,如果由 bin 选项,就会在 npm 的目录下增加命令 vue 软链接至 "bin/vue.js"文件 + +
+ +- 执行 vue 命令时发生了什么?为什么 vue 指向一个 js 文件,我们却可以直接通过 vue 命令去执行它? + 1.在 npm 的目录下执行 vue,相当于执行软链接的"bin/vue.js" + 2.在"bin/vue.js"文件中第一行代码 #!/usr/bin/env node 会根据当前用户 node 的环境变量,用 node 去执行该 js 文件 + +##### \*补充 + +- 给文件添加可执行权限 + +``` +chmod 777 test.js +``` + +## 脚手架原理进阶 + +- 为什么说脚手架的本质是操作系统的客户端?它和我们在 PC 上安装应用软件有什么区别? + 因为 node 本身就是操作系统的客户端,和 PC 上安装的应用软件没有本质的区别,只是没有 GUI + +- 如何为 node 脚手架命令创建别名 + 可以将软链接指向另一个软链接 diff --git "a/docs/pages/pjj/images/02_\350\204\232\346\211\213\346\236\266\346\211\247\350\241\214\345\216\237\347\220\206.png" "b/docs/pages/pjj/images/02_\350\204\232\346\211\213\346\236\266\346\211\247\350\241\214\345\216\237\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..02eba01c9a93f7af43c1e11795b32b7b2ec994d3 GIT binary patch literal 8044 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 z zB<6L6w+VLi=rKoO+(#8S#>XdrBx6bCS>3vQFd4*>gBLNncK@3=e)zG1^+MExoFGb@ zwK{vB#Pu)FQXFZ3i=V0Jkz4QbEFFqS0z!chBI44%-F+^DjIJ9_ET(fGddxK9YDo@6 zB&OX)?6K0x@zR8^9>P1bp+7cz5-z&-d}CVQN&x~~WN)e?_~=dq+(!NF@{?fzwV;(c zFcNI7nEI4+2E4}@mr(8-wf0^yh{7i%D z32=~q(0OFKzHcE6vSpiIvxzb~sMr$wPycucGaiM*1XYh*$B|++r}64C zHyIK=w{J?f!rtP9ypu#rt@$On*~rv;e=de8Me zlw8U;t1(;}DM0|acYcYhLzz6Fx4vQ4Jo1-OGS6XqS0D>dVIe*f?P!X)2Y7BGG|F9{w*Hbz+_4soVZ?`@pJ|e;y)@hGQ zr7qqZ@j$5rQqbl&@`T~pPWh$n&AbQ?H3fhx1$PbpefN%2$&Ze zW)X?pJA%mntoWaE{C{XYwXeckyfDlL>Xtvhe}23;UbBU=VbYPHL-JX|5t@U#+O+@f zJJD9FaF{54#D=q@@YljMQaS)2wt@?-#wyYnoUCmy@73c19B*`T=I1UJpcpysegzsT zx?+c{riHGIhE)^>kg&A!KRSg6!1uq4G6eqYS(f4e%*8ur_W#+7Tt!d;x$+IsKc}bQ z0T{?f$tDK>PhT`3KoMxq_~$)2^=G>@A82scrIY5a|Jeoo4N^jFTWM?kDaK9!XtRin z-^t|t?>_5M`*SjaiqOREVDkJAF-jr;2%F4#!2Z#J^#?X|aKHcTpJGga;Ma$&=zsF3 zj@tlothUBS|Jj7?MFOyESe Date: Mon, 29 Nov 2021 23:27:28 +0800 Subject: [PATCH 3/6] =?UTF-8?q?pjj=20=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\221\250\347\254\224\350\256\260.md" | 177 ++++++++++++++++++ 1 file changed, 177 insertions(+) diff --git "a/docs/pages/pjj/02.\347\254\254\344\272\214\345\221\250\347\254\224\350\256\260.md" "b/docs/pages/pjj/02.\347\254\254\344\272\214\345\221\250\347\254\224\350\256\260.md" index dc8d8b4..4f58ad8 100644 --- "a/docs/pages/pjj/02.\347\254\254\344\272\214\345\221\250\347\254\224\350\256\260.md" +++ "b/docs/pages/pjj/02.\347\254\254\344\272\214\345\221\250\347\254\224\350\256\260.md" @@ -81,3 +81,180 @@ chmod 777 test.js - 如何为 node 脚手架命令创建别名 可以将软链接指向另一个软链接 + +## 脚手架开发流程详解 + +### 开发流程 + +- 创建 npm 项目 +- 创建脚手架入口文件,最上方添加 + +``` +#!/usr/bin/env node +``` + +- 配置 package.json 添加 bin 属性 +- 编写脚手架代码 +- 将脚手架发布到 npm + +### 使用流程 + +- 安装脚手架 + +``` +npm install -g your-own-cli +``` + +- 使用脚手架 + +``` +your-own-cli +``` + +### 脚手架开发难点解析 + +- 分包:将复杂的系统拆分成若干个模块 +- 命令注册额: + +``` +vue create +vue add +vue invoke +``` + +- 参数解析: + + - options 全称:--verison、--help + - options 简写:-V、-h + - 带 params 的 options:--path /Users/pujunjie/Desktop/ + +示例: + +``` +vue command [options] +``` + +帮助文档: + +- global help + - Usage + - Options + - Commands + +示例:vue 的帮助信息: + +``` +Usage: vue [options] + +Options: + -V, --version output the version number + -h, --help output usage information + +Commands: + create [options] create a new project powered by vue-cli-service + add [options] [pluginOptions] install a plugin and invoke its generator in an already created project + invoke [options] [pluginOptions] invoke the generator of a plugin in an already created project + inspect [options] [paths...] inspect the webpack config in a project with vue-cli-service + serve [options] [entry] serve a .js or .vue file in development mode with zero config + build [options] [entry] build a .js or .vue file in production mode with zero config + ui [options] start and open the vue-cli ui + init [options]