閱讀324 返回首頁    go 阿裏雲 go 技術社區[雲棲]


阿裏雲前端工程化工具 - Dawn

一、Dawn 簡介

Dawn(後續將簡稱為 DN)是阿裏雲前端團隊,新一代的前端構建工具,簡化並統一了針對開發人員的「命令行接口」,將開發過程抽象為有序的 6 個階段 + 1 個常用操作。不會因為工具本身的擴展,而擴展新的用法,統一、一致,免於記憶,通過 DN 創建的工程還將會結合 GitLab CI 進行持續集成。

DN 相較於同類工具的特點是什麼?

  • 簡單、統一、一致,無論擴展還是使用它。
  • 無關框架、甚至可以無關語言、輕中心化(並非完全去中心化,而是「輕」)
  • 鬆散且易於整合,注重重用,易於擴展
  • 雲端統一下發構建規則,易團隊統一管理
  • 免於安裝或更新,除 CLI 外,無須其它任何形式的安裝和更新操作

相較於同類工具而言,DN 采用了獨有的機製,將整個整個工具拆分為三大部分:

  1. CLI(命令行工具)
  2. Middleware(中件間)
  3. Template(工程模板)

通過「中間件」方式抽離可重用功能,包括但不限於「創建、構建、測試、發布」等,不同階段可能出現的操作,都將通過簡單的 API 封裝為「中間件」,並相互「無依賴」,鬆散且易於整合。

任何搭建好的「普通工程」,都可以輕鬆發布為「模板」,製作模板變得極其簡單,隻需做兩件事情:

  1. 組織工程目錄結構並配好相關依賴。
  2. 配置 pipe.yml 聲明各階段要做的事情。

那麼,使用 DN 的同學分為兩大類:

  1. 使用者:使用 DN 工具及其生態,進行工程創建、構建、測試、發布等工作
  2. 貢獻者:為 DN 開發新的「中件間」,製作新的「工程模板」,或提出任何建議。

二、安裝和更新

依賴的環境、軟件及其版本:

  • 需要在公司內網或撥入 VPN
  • Node.js v7.6.0 及以上版本
  • Tnpm 4.x 因為 DN 發布於內網 registry
  • 部分現有中件間還依賴 Git,比如「前端資源發布中件間」

安裝或更新 DN:

$ tnpm i @ali/dawn -g

部分同學的電腦可能需加 sudo

二、基本使用

1. init 命令

$ mkdir demo
$ cd demo
$ dn init [template] [--force]

如果指定了 template 直接按指定的模板初始化項目,否則列出來可用「模板列表」,如下:

? 共 8 個可用模板,回車初始化對應工程 (Use arrow keys)
 1. node              : 普通 Node.js 工程
  2. front             : 普通 SPA 前端工程
  3. multipage         : 支持多頁麵的前端工程
  4. dbl-template-dblm : DBL 團隊移動工程模板
  5. console           : 控製台模板
  6. prev2next         : prev 版本 dbl 工程一鍵遷移
  7. midway            : midway 工程模板
  8. middleware        : DBL vNext 中間件工程

選擇一個工程類型,回車即可按向導初始化一個工程。

2. dev 命令

$ dn dev 

通過 dev 命即可開始開發,通常會啟動自動構建服務,取決於你的工程模板可能會有不同處理,例如 front 工程 會啟動並打印出相關信息:

加載中間件...
完成
清理文件或目錄...
完成
開始構建...
啟動開發服務器...
The server on "localhost:8001" started
實時編譯完成: 1493200481119

3. test 命令

$ dn test

test 是至關重要的命令,重要的動作之前常會觸發 test 的執行,比如 publish 之前,同時,通過 DN 創建工程將會自動啟用 CI(持續集成),當你有新的代碼 push 到 Git 某個分支,會是創建了 Merge Request 時,CI Job 將會被觸發,將會通過 dn test 進行自動化測試,在測試通過後還將嚐試通過 dn build 自動構建,執行示例如下:

加載中間件...
完成
執行靜態檢查...

/Users/ali-130284n/demo/src/index.js
  1:1  warning  Unexpected console statement  no-console

 1 problem (0 errors, 1 warning)

完成

4. build 命令

$ dn build

執行構建任務,不同的工程類型的構建過程和結果可能不同,取決於初始化工程時使用的工程模板,例如 例如 front 工程 會打包所有前端資源並錢如下信息:

加載中間件...
完成
清理文件或目錄...
完成
開始構建...
完成

完成後,會在當前項目的根目錄產生 build 目錄,這是構建結果。

5. publish 命令

可以通過 publish 命將發布代碼或構建結果,不同的工程模板決定了最終發布位置,是否支持 publish 命令決定於選擇的「工程模板」,比如 front 工程的發布大約如下:

發布到預發...
加載中間件...
完成
執行靜態檢查...

/Users/ali-130284n/ali/dev/dbl-repos/dbl-template-front/src/index.js
  1:1  warning  Unexpected console statement  no-console

 1 problem (0 errors, 1 warning)

完成
加載中間件...
完成
找到存在的 pre-push
清理文件或目錄...
完成
開始構建...
完成
Total 0 (delta 0), reused 0 (delta 0)
To gitlab.alibaba-inc.com:dbl-repos/dbl-template-front.git
   3cf3
完成

如果您僅僅是使用 DN,用於創建、構建或發布工程,我告訴你,這幾個命令就夠了,如果您想進一步了解,或者貢獻 DN,擴展或改過它,那麼繼續向下看。

三、命令執行過程

初始化執行過程

alt

命令(pipe)執行過程

alt

四、如何製作一個工程模板

通常您應先看看是否已經存滿足您需求的模板,查看已發布的工程模板,可以通過如下命令:

$ dn system template

將會列出所有可用的工程模板,如下:

? 共 8 個可用模板,回車打開說明文檔 (Use arrow keys)
 1. node              : 普通 Node.js 工程
  2. front             : 普通 SPA 前端工程
  3. multipage         : 支持多頁麵的前端工程
  4. dbl-template-dblm : DBL 團隊移動工程模板
  5. console           : 控製台模板
  6. prev2next         : prev 版本 dbl 工程一鍵遷移
  7. midway            : midway 工程模板
  8. middleware        : DBL vNext 中間件工程

上下箭頭鍵可以選擇指定中件間,然後「回車」可以查看對應中件間的在線使用說明。

DN 本身隻對開發人員提供一致的命令行接口,不同的工程類型的構建過程,由和 template 通過 pipe 配置聲明各個階段 pipeline 中的 middleware 完成,一個「普通的工程」搭建好後就可發布為一個「工程模板」,通常一個「工程模板」有基本固定的目錄結構,比如:

project
├── .dbl-next
├── README.md
├── build
│   ├── index.html
│   └── js
│       ├── common.js
│       └── index.js
├── package.json
└── src
    ├── assets
    │   └── index.html
    └── index.js

模板配置存放於 .dn-next 目錄,其中最重要的是 pipe 配置,大體如下:

init:
  - name: tnpm-install
  - name: pkginfo

dev:
  - name: clean
  - name: webpack2
    watch: true
  - name: server

build:
  - name: clean
  - name: webpack2

test:
  - name: lint

publish:
  - name: shell
    script:
      - dn test
      - dn build -e prod
  - name: alicdn-publish

每個階段都可聲明要做的事情,通常對慶一個個中件間,每個中件間可能用不同用法,不同的工程模板可根據需求進行不同的配置,具體用法可參考各中件間的使用說明。

pipe 還可以是 json 格式:

{
  "init": [
    {
      "name": "tnpm-install"
    }
  ],
  "dev": [
    {
      "name": "$local",
      "location": "./lib/index.js"
    }
  ]
}

工程模板通過 pipe 輔助 cli 完成對應的構建任務,一個工程中模板可以在每個 pipe 中放置多個「中間件」,支持的 pipe 有:

名稱 說明
init 在初始化工程的時候觸發
dev 在啟動開發服務時觸發
test 在添加項目元素時候觸發
test 在執行測試的時候觸發
build 在執行構建時觸發
pubish 在執行發布時觸發

工程模板製作完成後,推送到內網 GitLab 任意「公開的 Repo」 後,可聯係 @正鋒 發布對應工作模板。

五、如何開發一個中間件

通常您應先看看是否已經存滿足您需求的中件間,查看已發布的中間件,可以通過如下命令:

$ dn system middleware

將會列出所有可用的中間件,如下:

? 共 14 個可用中件間,回車打開說明文檔 (Use arrow keys)
 01. shell          : 可執行 shell 的中間件
  02. list           : 通過列表選擇進行分支執行的中件間
  03. pkginfo        : 可設定 Node 包信息的中間件
  04. clean          : 清理文件或目錄的中件間
  05. prepush        : Git Hook - pre-push
  06. tnpm-install   : Node 模塊依賴安裝插件
  07. tnpm-publish   : Node 模塊依賴安裝插件
  08. lint           : 語法檢查中間件
  09. mocha          : 基於 mocha 的單元測試中間件

上下箭頭鍵可以選擇指定中件間,然後「回車」可以查看對應中件間的在線使用說明,多數常用的功能,比如 webpack、lint 都已有可用的「中間件」提供。

當您決定要開發一個新的中件間時,您可以通過 dn init 命令,然後選擇「中件間工程模板」即可快速創建一個「中件間」,如下:

? 共 8 個可用模板,回車初始化對應工程
  1. node              : 普通 Node.js 工程
  2. front             : 普通 SPA 前端工程
  3. multipage         : 支持多頁麵的前端工程
  4. dbl-template-dblm : DBL 團隊移動工程模板
  5. console           : 控製台模板
  6. prev2next         : prev 版本 dbl 工程一鍵遷移
  7. midway            : midway 工程模板
 8. middleware        : DBL vNext 中間件工程

DN 中間件和 Koa 中件間類似,中件間核心基礎代碼結構如下:

/**
 * 這是一個標準的中間件工程模板
 * @param {object} opts cli 傳遞過來的參數對象 (在 pipe 中的配置)
 * @return {AsyncFunction} 中間件函數
 */
module.exports = function (opts) {

  //外層函數的用於接收「參數對象」
  //必須返回一個中間件處理函數
  return async function (next) {

    //在這裏處理你的邏輯
    this.console.log('This is an example');

    //next 觸發後續執行
    //如果需要在後續中間件執行完成再做一些處理
    //還可以 await next(); 並在之後添加邏輯
    next();

  };

};

中間件開發完成後,推送到內網 GitLab 任意「公開的 Repo」後,可聯係 @正鋒 發布對應中件間。

-- end --

AD:

阿裏雲業務運營前端團隊招聘 P6/7,歡迎推薦或轉崗。

最後更新:2017-07-24 16:02:35

  上一篇:go  在E-MapReduce集群內運行Spark GraphX作業
  下一篇:go  阿裏雲RDS金融數據庫(三節點版) - 案例篇