前言:基于vue來(lái)開發(fā)一個(gè)簡(jiǎn)單的界面ui插件。
手動(dòng)發(fā)布npm包
一、首先上去npm注冊(cè)一個(gè)賬號(hào)(這不用說(shuō)了,略過(guò))
網(wǎng)址:https://www.npmjs.com/
記住賬號(hào)、密碼、郵箱,后面發(fā)布需要用到。
二、初始化一個(gè)vue項(xiàng)目
vue create package-name
創(chuàng)建一個(gè)packages文件夾(重要),里面放的就是你的插件組件(可以這樣說(shuō)),最終目錄結(jié)構(gòu)我的是這樣,可以參考,根據(jù)自己的實(shí)際情而定。

插件目錄分析
-
docs:文檔說(shuō)明 -
packages:插件組件 -
src:下面有assets(資源文件)、components(頁(yè)面組件)、app.vue(頁(yè)面入口)、main.js(入口文件)、index.js(重點(diǎn):插件主入口文件)
其實(shí)這個(gè) src 目錄你可以作為一個(gè)測(cè)試的作用,因?yàn)槟阋獙懙氖遣寮?,全部都是?packages 文件里面。
三、添加插件組件
我們?cè)?packages 下面新建一個(gè) kdd-link 文件夾,文件大概就是這樣

index.js(重點(diǎn))
// 導(dǎo)入組件,組件必須申明name
import KddLink from './src/kdd-link';
// 為組件提供install方法,供按需引入
KddLink.install = function (Vue) {
Vue.component(KddLink.name, KddLink)
}
// 導(dǎo)出組件
export default KddLink
kdd-link.vue
<template>
<a :href="href" v-bind="$attrs">
<slot></slot>
</a>
</template>
<script>
export default {
name: "KddLink", // 名字一定要寫
props:{
href: {
type: String,
default: ''
}
name:{
type: String,
default: ''
}
},
}
</script>
這樣算是寫完一個(gè)組件了。
寫一下index.js文件
import KddLink from '../packages/kdd-link/index.js';
const components = [
KddLink
]
const install = function (Vue) {
if (install.installed) {
return
}
install.installed = true;
components.map(component=>{
Vue.component(component.name,component)
})
}
if(typeof window !== 'undefined' && window.Vue) {
install(window.Vue)
}
export default {
install,
KddLink
}
我們來(lái)測(cè)試一下可不可以使用。
- 首先在main.js里面引入

- 在app.vue 里面使用

-
效果
效果
ok,到這里為止就算是寫好這個(gè)插件了
package.json文件
發(fā)包肯定少不了配置package.json,這里我說(shuō)幾個(gè)主要的

.gitignore文件
提交上github上需要忽略的文件,有些文件就不要提交上去了,比如 node_modules 下面的依賴包
.DS_Store
node_modules
/dist
/lib/
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.eslintrc.js
.npmignore文件
發(fā)布的時(shí)候需要忽略的文件。
node_modules/
vue.config.js
babel.config.js
*.map
*.html
src/
docs/
.idea
.vscode
.eslintrc.js
.github/
test/
.github/
test.js
我這邊發(fā)布的時(shí)候就發(fā)了這幾個(gè)文件,僅供參考,視情況而定,比如你這個(gè)包又需要兼容ts,那可能又有其他的文件。

這樣我們的插件算是寫完了
四、發(fā)布(在目錄下)
- 發(fā)布之前需要npm run lib,會(huì)自動(dòng)生成lib文件夾。
- npm login:登錄需要username、password、email,其中password輸入時(shí)看不見的,只要保證你輸入的時(shí)正確的,回車就可以繼續(xù)了。
- npm publish:發(fā)布
這樣,就算是完成這個(gè)插件的發(fā)布了
你以為就會(huì)這樣完了嗎,就這?不!在登錄的過(guò)程中你可能會(huì)遇到各種各樣的問(wèn)題,比如:

怎么解決?有問(wèn)題,肯定就有解決方案
解決辦法:
- 先清除掉以前的代理設(shè)置
npm config set proxy null
npm config set https-proxy null
- 重新設(shè)置
npm config registry http://registry.cnpmjs.org/
這個(gè)問(wèn)題呢,我自己也是網(wǎng)上搜刮來(lái)的答案,參考鏈接npm err安裝報(bào)錯(cuò)解決辦法,其實(shí)也有其他的解決方法,看哪個(gè)有用就完了。
總之,遇到問(wèn)題,百度或者其他問(wèn)同事問(wèn)網(wǎng)友,總能解決的。
最后,我們的插件終于發(fā)布成功了,我們來(lái)看一下,在其他項(xiàng)目安裝這個(gè)插件看看能不能使用。
npm install 包名
引入插件
import ui from '包名'
補(bǔ)充
如果在引入的過(guò)程中出現(xiàn)一個(gè)說(shuō)你沒(méi)有安裝這個(gè)插件的問(wèn)題,但你明明已經(jīng)安裝了,不要著急,應(yīng)該就是你在插件的package.json文件沒(méi)有寫對(duì) main 的路徑。
這個(gè)就是main的作用:插件的主入口
使用
import ui from '包名'
Vue.use(ui);
<kdd-link target="_blank">這是啥鏈接</kdd-link>

大功告成?。。?/p>
Github持續(xù)集成自動(dòng)化發(fā)布npm包
實(shí)際應(yīng)用中,我們發(fā)布插件不可能每次都 npm run build 然后 npm login npm publish,這屬實(shí)有點(diǎn)麻煩,能不能簡(jiǎn)單一點(diǎn),我提交個(gè)代碼或者合并代碼的時(shí)候就發(fā)布呢?那就是持續(xù)集成,自動(dòng)化發(fā)布了。
什么是持續(xù)集成
持續(xù)集成指的是,頻繁地(一天多次)將代碼集成到主干。
它的好處主要有兩個(gè)。
- 快速發(fā)現(xiàn)錯(cuò)誤。每完成一點(diǎn)更新,就集成到主干,可以快速發(fā)現(xiàn)錯(cuò)誤,定位錯(cuò)誤也比較容易。
- 防止分支大幅偏離主干。如果不是經(jīng)常集成,主干又在不斷更新,會(huì)導(dǎo)致以后集成的難度變大,甚至難以集成。
持續(xù)集成的目的,就是讓產(chǎn)品可以快速迭代,同時(shí)還能保持高質(zhì)量。它的核心措施是,代碼集成到主干之前,必須通過(guò)自動(dòng)化測(cè)試。只要有一個(gè)測(cè)試用例失敗,就不能集成。
一、首先就是你的代碼要放在GitHub上(這不是廢話?)

二、找到Actions創(chuàng)建workflow模板
我這是基于vue的插件,所以選擇Node.js Package 點(diǎn)擊Set up this workflow

三、點(diǎn)擊 Commit new file 提交文件

項(xiàng)目中即可生成下列文件
.github
?|- workflows
???|- npmpublish.yml
npm-publish.yml
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
name: Node.js Package
on:
release:
types: [created]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14
- run: npm ci
- run: npm test
publish-npm:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14
registry-url: https://registry.npmjs.org/
- run: npm ci
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
publish-gpr:
needs: build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14
registry-url: https://npm.pkg.github.com/
- run: npm ci
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
四、代碼拉取下來(lái)修改一下
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
name: Node.js Package
on:
pull_request:
branches:
- master
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14
- run: npm ci
- run: npm test
publish-npm:
needs: patch
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14
registry-url: https://registry.npmjs.org/
- run: npm ci
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
其實(shí)就是刪了publish-gpr,gpr(Github Package Registry)修改on觸發(fā)條件。
下面來(lái)解釋一下各個(gè)部分的含義
-
name此工作流的名稱。 -
on觸發(fā)條件,上述文本表示當(dāng)master分支合并和推送時(shí)會(huì)觸發(fā)workflow。 -
jobs工作集合,例如jobs內(nèi)部的build、publish-npm表示具體的工作任務(wù)的ID,可以自定義。 -
needs表示當(dāng)前的job依賴與另外一個(gè)job,例如上面的publish-npm依賴于build。 -
runs-on表示工作所在的虛擬機(jī)操作系統(tǒng),目前可選的系統(tǒng)有ubuntu-latest、ubuntu-18.04、ubuntu-16.04、windows-latest、windows-2019、windows-2016、macOS-latest、macOS-10.14。 -
steps表示job所執(zhí)行的actions和commands集合。
五、添加npm access Tokens
- 去到官網(wǎng),的點(diǎn)擊自己的賬號(hào)頭像,找到 access Tokens

- 新增一個(gè)token,Generate New Token

- 選擇token類型,我選的是Automation,翻譯過(guò)來(lái)就是,就是發(fā)布插件,自動(dòng)令牌將繞過(guò)雙因素身份驗(yàn)證。如果啟用了雙因素身份驗(yàn)證,則在使用自動(dòng)化令牌時(shí)不會(huì)提示您,使其適合CI/CD工作流。點(diǎn)擊Generate Token。

- 就創(chuàng)建成功了,一定要復(fù)制保存下來(lái),不然關(guān)閉窗口就沒(méi)了

六、github創(chuàng)建一個(gè)secrets
setting頁(yè)面

Name 就填寫npm_token,因?yàn)槟愕膎pm-publish.yml文件寫的就是${{secrets.npm_token}},把剛剛復(fù)制的token粘貼過(guò)來(lái)。

七、本地代碼推送,在Actions頁(yè)面就可以看到持續(xù)集成的結(jié)果了。


如果后面再更新發(fā)布版本,只要更換npm_token的值就行啦。


可能在過(guò)程中會(huì)遇到一個(gè)問(wèn)題,就是你的包在npm上已經(jīng)有了這個(gè)版本

package.json修改版本重新推送一下就可以。

到這里就算是全部工作完成了,以后繼續(xù)努力。
