溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

element怎么用腳本自動化構(gòu)建新組件

發(fā)布時間:2022-03-03 14:59:53 來源:億速云 閱讀:149 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“element怎么用腳本自動化構(gòu)建新組件”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“element怎么用腳本自動化構(gòu)建新組件”這篇文章吧。

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

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

    makefile

    在element-ui項目根目錄有個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---  編譯項目,生成目標(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'"

    # 注釋輸出

    element怎么用腳本自動化構(gòu)建新組件

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

    element怎么用腳本自動化構(gòu)建新組件

    當(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é)束

    如此便會生成如下文件

    element怎么用腳本自動化構(gòu)建新組件

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

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

    element怎么用腳本自動化構(gòu)建新組件

    這樣直接循環(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是這么做的:

    element怎么用腳本自動化構(gòu)建新組件

    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)然,其實我們可以直接使用node的fs.writeFile這個API去創(chuàng)建文件,

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

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

    以上是“element怎么用腳本自動化構(gòu)建新組件”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI