最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

element用腳本自動化構(gòu)建新組件的實(shí)現(xiàn)示例

 更新時間:2021年12月23日 10:51:52   作者:Wailen  
本文主要介紹了element-ui的用腳本自動化構(gòu)建新組件的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

背景

在公司的項(xiàng)目中,每次碰到新需求的時候,你是不是都還在用新建頁面 => 往頁面中添加內(nèi)容,如vue模板 => 添加路由。難道不覺得麻煩嗎?如果是的話,不妨試試自動化構(gòu)建吧,太香了~

element-ui的自動化構(gòu)建是怎么做的

在開源項(xiàng)目中,特別是UI庫的開發(fā),有太多人協(xié)同,每個人的code習(xí)慣也都不一樣。并且UI庫中每個組件都還會涉及到多語言、單元測試、路由、組件的readme.md文檔等文件。所以如果每次都慢慢去創(chuàng)建這些則太麻煩了,并且多人修改公共文件如路由文件會產(chǎn)生非常多的沖突。所以在開源項(xiàng)目中都會有非常多的腳本,去自動化生成某些文件。

makefile

在element-ui項(xiàng)目根目錄有個makefile文件,每條命令的作用都在注釋中。windows用戶要使用make命令執(zhí)行腳本得下載。mac用戶不需要。

@# 默認(rèn)的#注釋會在日志中輸出,@#則不會
@# .PHONY的作用: 在下方的腳本命令中忽略檢查是否與dist、test目錄沖突,也就是說無論如何都會去執(zhí)行命令
.PHONY: dist test

@# 執(zhí)行make命令時,默認(rèn)執(zhí)行help腳本
default: help

@# 執(zhí)行`make build-theme`就是執(zhí)行`npm run build:theme`腳本,
@# : 冒號前面為執(zhí)行的命令,冒號后面第二行第一個應(yīng)該為一個tab,tab之后跟腳本命令
@# 也就是說下面的為 'tab+npm npm build: theme'
# build all theme
@# 上面的build theme注釋可以查看下方的截圖,會在日志中輸出
build-theme: 
 npm run build:theme
install:
 npm install
dev:
 npm run dev
@# $()為使用函數(shù)
@# $@ 為當(dāng)前命令本身比如 'make new',$@ 就是 new
@# MAKECMDGOALS 特殊變量,該變量記錄了命令行參數(shù)指定的目標(biāo)列表,也就是說使用這個變量,我們可以得到命令行的參數(shù)
@# 比如我們在創(chuàng)建新組件時,使用腳本`make new wailen` MAKECMDGOALS 就等于 wailen
@# filter-out 反過濾函數(shù),過濾掉 $(MAKECMDGOALS) 中所有含有 $@ 的內(nèi)容
@# 結(jié)合new.js的內(nèi)容,下方腳本的意思也就是創(chuàng)建新組建,傳入組件名稱,組件名稱不得為new,如果組件名稱取為new,可以查看下方截圖
new:
 node build/bin/new.js $(filter-out $@,$(MAKECMDGOALS))
@# 省略了一些腳本,感興趣的可以自行查看源碼
help:
 @echo "   \033[35mmake\033[0m \033[1m命令使用說明\033[0m"
 @echo "   \033[35mmake install\033[0m\t\033[0m\t\033[0m\t\033[0m\t---  安裝依賴"
 @echo "   \033[35mmake new <component-name> [中文名]\033[0m\t---  創(chuàng)建新組件 package. 例如 'make new button 按鈕'"
 @echo "   \033[35mmake dev\033[0m\t\033[0m\t\033[0m\t\033[0m\t---  開發(fā)模式"
 @echo "   \033[35mmake dist\033[0m\t\033[0m\t\033[0m\t\033[0m\t---  編譯項(xiàng)目,生成目標(biāo)文件"
 @echo "   \033[35mmake deploy\033[0m\t\033[0m\t\033[0m\t\033[0m\t---  部署 demo"
 @echo "   \033[35mmake pub\033[0m\t\033[0m\t\033[0m\t\033[0m\t---  發(fā)布到 npm 上"
 @echo "   \033[35mmake new-lang <lang>\033[0m\t\033[0m\t\033[0m\t---  為網(wǎng)站添加新語言. 例如 'make new-lang fr'"

# 注釋輸出

過濾new關(guān)鍵字,當(dāng)傳入?yún)?shù)為new時,過濾掉

當(dāng)然,如果不想使用make直接執(zhí)行node腳本即可,比如make new 組件名 等同于 node build/bin/new.js 組件名

new.js

new.js為自動化的核心文件。我們先思考一下,創(chuàng)建組件文件無非就是兩個步驟

  • 創(chuàng)建文件
  • 添加內(nèi)容

file-save

主要是通過file-save這個包創(chuàng)建文件并添加內(nèi)容。先來看看api

const fileSave = require('file-save');
const content = "const fs = require('fs');"
const callback = () => { console.log('腳本執(zhí)行') }
fileSave('文件路徑')
   .write('文件內(nèi)容比如上面的content', 'utf8', callback) // 內(nèi)容寫入成功會觸發(fā)回調(diào)
   .write('繼續(xù)添加content','utf8')
   .end('\n') // 文件操作結(jié)束,以空白行結(jié)束

如此便會生成如下文件

更多的文檔可以查看file-save

element-ui中就是先通過一個Files數(shù)組對象管理了需要創(chuàng)建的filename以及code content。

這樣直接循環(huán)Files就能創(chuàng)建對應(yīng)的文件了。

// 創(chuàng)建 package
// 組件生成的目錄
const PackagePath = path.resolve(__dirname, '../../packages', componentname);
Files.forEach(file => {
  fileSave(path.join(PackagePath, file.filename))
    .write(file.content, 'utf8')
    .end('\n');
});

引用資源文件的修改

另外,一般創(chuàng)建了組件還需要修改相應(yīng)需要引用組件的地方,比如路由配置文件等。我們同樣可以通過file-save去添加對應(yīng)的路由。本身file-save會覆蓋之前文件中的內(nèi)容,也就是刪除過后重新再次生成。所以如果是在原有基礎(chǔ)上做增的操作的話,就需要獲取到原有文件的內(nèi)容,再在此基礎(chǔ)上拼接新內(nèi)容。我們可以這樣做:

const fileSave = require('file-save');
const fs = require('fs');

const content = `const fileSave = require('file-save'); `
const oldCode = fs.readFileSync('./demo.js')
fileSave('demo.js')
  .write(oldCode+content, 'utf8')
  .end('\n')

也就是通過fs模塊讀取到文件的舊內(nèi)容,再拼接即可。element-ui是這么做的:

fs.createWriteStream

file-save原理就是通過fs.createWriteStream這個api做了一層封裝。
簡單說下使用

const fs = require('fs')

//創(chuàng)建可寫流 fs.WriteStream 類的對象,繼承自 <stream.Writable>
const writer = fs.createWriteStream('createStream.js', { // 查找該文件,沒有則創(chuàng)建
    //默認(rèn)值為w, 通過調(diào)用writer.write方法寫入數(shù)據(jù)的時候,會直接覆蓋文件所有的內(nèi)容,
    // 即會把文件之前的內(nèi)容全部再刪除,寫入新的數(shù)據(jù)
    flags: 'w'
})


//寫入數(shù)據(jù)到流
writer.write('這個文件的新內(nèi)容')

file-save的源碼內(nèi)容可以查看下面的偽代碼。

const savefs = {}
savefs._create_dir = function (fp, opts) {
  mkdirp.sync(fp, opts);
}
savefs.wstream = function (file) {
  var ws = fs.createWriteStream(file);
  this.writer = ws;
  return this;
}
savefs.write = function(chunk, encoding, cb) {
  ...
}

savefs.end = function(chunk, encoding, cb) {
  ...
}

savefs.finish = function(cb) {
  ...
}

savefs.error = function(cb) {
  ...
}
export { savefs }

當(dāng)然,其實(shí)我們可以直接使用node的fs.writeFile這個API去創(chuàng)建文件,

fs.writeFile('文件路徑','要寫入的內(nèi)容',['編碼'],'回調(diào)函數(shù)');

可以發(fā)現(xiàn)參數(shù)跟file-save一樣

總結(jié)

歸根到底,自動化創(chuàng)建組件無非就是兩個核心創(chuàng)建文件 添加內(nèi)容。通過file-save這個包就可以實(shí)現(xiàn)這兩個操作,然后我們再結(jié)合自身的業(yè)務(wù),配置好生成文件的路徑與內(nèi)容,以及做好某些公共文件對新文件資源引用的修改即可。有沒有覺得node寫腳本,比寫后端有意思多了~

到此這篇關(guān)于element用腳本自動化構(gòu)建新組件的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)element腳本自動化構(gòu)建新組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue中PC端地址跳轉(zhuǎn)移動端的操作方法

    vue中PC端地址跳轉(zhuǎn)移動端的操作方法

    最近小編接到一個項(xiàng)目pc端和移動端是兩個獨(dú)立的項(xiàng)目,兩個項(xiàng)目項(xiàng)目中的內(nèi)容基本相同,鏈接組合的方式都有規(guī)律可循,接到的需求便是在移動端訪問pc端的URL連接時,重定向至移動端對應(yīng)頁面,下面小編給大家分享實(shí)現(xiàn)過程,一起看看吧
    2021-11-11
  • 簡單談?wù)刅ue中的diff算法

    簡單談?wù)刅ue中的diff算法

    diff算法的本質(zhì)是找出兩個對象之間的差異,目的是盡可能復(fù)用節(jié)點(diǎn)。,下面這篇文章主要給大家介紹了關(guān)于Vue中diff算法的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • vue項(xiàng)目中圖片選擇路徑位置static或assets的區(qū)別及說明

    vue項(xiàng)目中圖片選擇路徑位置static或assets的區(qū)別及說明

    這篇文章主要介紹了vue項(xiàng)目中圖片選擇路徑位置static或assets的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue.js標(biāo)簽頁組件使用方法詳解

    Vue.js標(biāo)簽頁組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue.js標(biāo)簽頁組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一
    2019-10-10
  • Vue數(shù)據(jù)改變但頁面沒有變的幾種情況及解決方法

    Vue數(shù)據(jù)改變但頁面沒有變的幾種情況及解決方法

    如果,你發(fā)現(xiàn)自己需要在Vue中做一次強(qiáng)制更新,99.99%的情況,是你在某個地方做錯了事,所以本文給大家介紹了Vue數(shù)據(jù)改變但頁面沒有變的幾種情況及解決方法,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • vue如何解決el-select下拉框顯示ID不顯示label問題

    vue如何解決el-select下拉框顯示ID不顯示label問題

    這篇文章主要介紹了vue如何解決el-select下拉框顯示ID不顯示label問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Vue首頁加載白屏原因以及10種解決方法匯總

    Vue首頁加載白屏原因以及10種解決方法匯總

    這篇文章主要介紹了Vue首頁加載白屏原因以及10種解決方法匯總,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • element-ui復(fù)雜table表格動態(tài)新增列、動態(tài)調(diào)整行以及列順序詳解

    element-ui復(fù)雜table表格動態(tài)新增列、動態(tài)調(diào)整行以及列順序詳解

    這篇文章主要給大家介紹了關(guān)于element-ui復(fù)雜table表格動態(tài)新增列、動態(tài)調(diào)整行以及列順序的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Vue實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲

    Vue實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Vue中v-if、v-if-else、v-else-if與v-show的基本使用

    Vue中v-if、v-if-else、v-else-if與v-show的基本使用

    v-if,v-else,v-else-if,v-if指令用于條件性地渲染一塊內(nèi)容,這塊內(nèi)容只會在指令的表達(dá)式返回truth值的時候被渲染,這篇文章主要給大家介紹了關(guān)于Vue中v-if、v-if-else、v-else-if與v-show的基本使用,需要的朋友可以參考下
    2022-10-10

最新評論

共和县| 肃宁县| 广州市| 寻甸| 阳山县| 兴仁县| 拜泉县| 延庆县| 北川| 沙田区| 青州市| 阿鲁科尔沁旗| 宝应县| 朝阳区| 江川县| 正镶白旗| 石城县| 游戏| 大安市| 雷州市| 娱乐| 绥滨县| 确山县| 蓝山县| 周至县| 九台市| 鸡泽县| 安图县| 栾城县| 民丰县| 于田县| 张家界市| 千阳县| 龙川县| 赣榆县| 曲阳县| 鄯善县| 三原县| 白河县| 信宜市| 井陉县|