部署项目并且发布源代码至 npm
[toc]
部署官网到 GitHub
需要大致完成两件事
- 部署官网
- 让官网上线,有文档层能直观地被看到,才会有人去使用
- 发布 Vueel UI
- 让其他开发者可以使用
npm install vueel3-ui
安装源码
- 让其他开发者可以使用
发布官网
就是把 dist 目录上传到网上
yarn buil
时要注意设置build path
发布官网的步骤
注意要关闭网站的自动翻译功能,会打乱代码
- 1.如果有 dist 目录,则删除 dist 目录
- 2.在
.gitignore
添加一行/dist/
然后提交代码 - 3.运行
yarn build
/vite build
创建出最新的dist
- 4.运行
hs dist -c-1
在本地测试网站是否成功运行 - 5.在部署到GitHub
- 1.运行
cd dist
到 dist 目录下 - 2.运行
git init;git add .;git commit -m 'init';
- 3.注意现在 dist 是一个套娃的git仓库
- 4.新建远程仓库
vueel-website
,并关联到 dist 目录 - 5.注意不是关联到上层仓库的目录
-
- 使用
git
协议的 点击SHH按钮,不要使用https
- 使用
- 2.开启项目的
Pages
功能
- 1.运行
|
|
- 注意强制覆盖
git push -f -u origin main
部署 GitHub Pages 发现 404
- 安装
yarn global add http-server
- 运行
hs dist -c-1
在本地测试网站是否成功运行 - 点击进入
http://127.0.0.1:8080
- 出现页面说明目前项目时可以部署的
- 但按照以上步骤部署发现页面一片空白
- 打开浏览器,开发者面板的ntework查看请求发现js和css资源都是404,而html请求正确
- 请求路径错误导致的404
- 需要重新设置
vite.config.ts
中的正确的路径build path
设置build path
对比html文件和其他文件的请求路径
- html 请求成功
Request URL: https://xmasuhai.xyz/vueel3-demo-website/index.html
- js 请求失败
Request URL: https://xmasuhai.xyz/assets/index.96031f0b.js
- css 请求失败
Request URL: https://xmasuhai.xyz/assets/index.98fa0c4b.css
- 发现路径中仓库名不同
GitHub 会删掉以下划线开头的目录,例如
_assets/
- 参考查看官方的配置
vite.config.js
- 目前vite版本已经去默认掉
assetsDir
下划线
仓库名不同
- 需要在
vite.config.ts
中设置base: './', ...
,以./
开头而不是以/
开头 - 重新部署即可正确显示页面
部署到码云
提升访问速度
- 直接使用 github 账号登录码云
- 拉取 github 对应仓库
- 打开服务 -> 部署 Gitee Pages
脚本化半自动部署
根目录下创建
deploy.sh
|
|
- 运行
sh deploy.sh
即可实现半自动部署 - 有时github部署会延迟,需要在浏览器network中开启禁用缓存,勾上
Disable cache
,刷新网页几次即可
使用GitHub Actions
持续集成
根目录下创建
.github/workflows/deploy-website.yml
|
|
发布 Vueel UI 至 npm
打包库文件
vite不支持打包,需要自行配置rollup
- 创建
lin/index.ts
,将所有需要导出的东西导出 - 创建
rollup.config.js
,放在根目录下,告诉rollup怎么打包 - 安装
rollup
相关依赖yarn global add rollup
yarn add -D rollup-plugin-esbuild rollup-plugin-vue rollup-plugin-scss sass rollup-plugin-terser @vue/compiler-sfc
- 运行
rollup -c
编译库文件
lin/index.ts
|
|
rollup.config.js
|
|
rollup -c
编译库文件
运行
rollup -c
发现报错
- 逐个删除插件尝试
- 改变插件顺序
rollup.config.js
|
|
忽略警告
(!) Unresolved dependencies...
(!) Missing global variable names...
编译
src/lib/index.ts → dist/lib/vueel3.js...
- 生成
dist/lib/vueel3.css
和dist/lib/vueel3.js
解释 rollup.config.js
新增几个插件
|
|
发布 dist/lib
目录,上传到npm服务器
在package.json
中添加files
和main
package.json
|
|
"files": [ "dist/lib/*" ]
写上所有需要上传的文件"main": "dist/lib/vueel3.js",
说明主文件
npm login
确保已切换至npm官方源,而没有使用淘宝源
- 查看npm源
npm config get registry
- 切换至npm官方源
npm config set registry https://registry.npmjs.org
- 切换回npm淘宝源
npm config set registry https://registry.npm.taobao.org/
注册npm,之后在命令行中使用
npm login
登录
npm login
- 按提示输入
Username
、Email
和Password
- 注意只有使用了官方源,才能正确登录
npm publish
|
|
- 完成发布后,就可以通过
yarn add vue3-demo-ui-1
来使用了
一些细节
name
package
的name
必须是小写字母,可用-
或_
连接package
的name
不能和npm上现有的name重名
version
- 每次 publish 的版本不能和之前任何一次的相同
- 之后的更改中,必须先改
version
再npm publish
- 注册
npmjs.com
账号- 使用网页注册,然后再命令行使用
npm login
登录 - 登陆之后才能
npm publish
- 使用
npm logout
可以退出登录
- 使用网页注册,然后再命令行使用
小技巧
使用 nrm 快速切换源
- 安装
npm i -g nrm --registry https://registry/npm.taobao.org
nrm ls
可以查看所有源nrm use taobao
可以切换到淘宝源nrm use npm
可以切换回npm官方源
修复本地运行不出现而部署dist后出现的 bug,完善功能
模拟别人使用自己的组件
测试自己的 package
- 在空白目录中使用
@vue/cli
新建一个vue3
项目 - 安装自己的包
yarn add vue3-demo-ui-1
|
|
重构组件名
- 统一改为以
Vl
开头的驼峰模式
修复 Tabs 组件的 bug
使用
hs dist -c-1
运行打包后的项目时,tab组件报错VlTabs 子标签必须是 VlTabItem
- 分别打出本地服务运行和打包后运行信息
|
|
- 在生产环境下,原始组件和
tab.type
是不严格相等的 - 改为判断组件的
name
属性,需设置属性
VlTabItem.vue
|
|
抽出判断组件名的逻辑
useCheckSlots.ts
|
|
VlTabs.vue
|
|
显示或隐藏代码
Demo.vue
|
|
<VlButton @click="toggle">{{ codeVisible ? '隐藏代码' : '查看代码' }}</VlButton>
修复 watchEffect
排除所有可能性,剩下的就是真相
- 不同版本之间的差异
RC
版和正式版
- 查看
vuejs/vue-next CHANGELOG.md
,搜索watchEffect
- 找到
3.0.0-rc.13 BREAKING CHANGES
watch APIs now default to use flush: 'pre' instead of flush: 'post'. This change affects watch, watchEffect, the watch component option, and this.$watch...
- 找到
watchEffect 副作用刷新时机
文档
VlTabs.vue
的实现思路
- 当用户点击
vue-tabs-nav-item
时,执行select(title)
select(title)
会向外发布自定义事件emits('update:selected', title);
- 将
title
传到外部,让外部组件更新自己的外部属性selected
- 将
- 当
selected
更新了,selectedItem
也更新selectedItem = ref<HTMLDivElement>(div)
<div v-for="(title, index) in titleListOfDefaultSlots" ... :ref="(el) => { if (el && (title === selected)) selectedItem = el }" @click="select(title)">...</div>
- 如果当
selected
更新了,selectedItem
未更新,就会出现bugwatchEffect
追踪的依赖是selectedItem
selected
变了,去渲染DOM- RC
watchEffect post
在渲染DOM后,selectedItem
变了 - 正式版
watchEffect pre
在渲染DOM前,selectedItem
没变
|
|
watchEffect
依赖的selectedItem
、container
、indicator
都不变的话,就不会执行watchEffect
回调逻辑- 需配置第二个参数
, {flush: post}
表示等到渲染DOM后再执行
再次完善官网
install.md
|
|
getStarted.md
|
|
总结
这样就完成了
- 部署官网到 GitHub
- 发布官网页面
- 部署到码云
- 脚本化部署
- 使用 GitHub Actions 持续集成
- 发布组件库至 npm
初步完成的轮子
把项目加到简历,Vue 2 如何升级到 Vue 3
- 查看 Vue 官方迁移指南文档
- 使用官方提供的工具和教程 vue-codemod
- 使用GoGoCode
更多
- 添加其他组件
Popover
Datepicker
Tooltip
- 使用
JSX
、TSX
- 使用
defineComponent
- 支持泛型,能更好地与
TypeScript
配合使用
- 支持泛型,能更好地与
- 通读Vue3 中文文档