使用yeoman構建angular應用

来源:http://www.cnblogs.com/yitim/archive/2017/08/13/7353738.html
-Advertisement-
Play Games

本文將介紹如何親手來完成一個yeoman的generator,以實現快速構建最適合自己的項目。 本文將實現的generator起名為ngtimo,依照yeoman的命名規矩就叫做generator ngtimo,是筆者這周末一晚上加一上午參考著yeoman官方給出的幾個generator( "gen ...


本文將介紹如何親手來完成一個yeoman的generator,以實現快速構建最適合自己的項目。
本文將實現的generator起名為ngtimo,依照yeoman的命名規矩就叫做generator-ngtimo,是筆者這周末一晚上加一上午參考著yeoman官方給出的幾個generator(generator-generatorgenerator-node)給強行催生出來的,目前也已經在github上托管併發布到npm。

實現效果

首先確保已經全局安裝了yeoman,然後再全局安裝generator-ngtimo:

npm install -g generator-ngtimo

安裝完成後即可使用yo命令來進行構建:

yo ngtimo

然後順利的話yeoman會像下麵這樣詢問一系列構建的配置,這裡筆者選擇輸入項目名稱為ng-test剩下的一路敲回車:

順利的話如下圖這樣的項目結構就誕生了,可以 cd 到項目目錄下(自動執行的 npm install 失敗的話再手動
npm install 一下),並運行 npm run server 啟動項目查看效果。

如果只是想要使用yeoman來快速進行項目搭建的話,只需要找到一個喜歡的generator,像上文這樣全局安裝然後yo它就可以了!不過只是使用別人的generator會有些不自由而且考驗對方的維護能力,就像筆者這個一時興起的ngtimo就才剛剛有了一個主模板而已,還需要做很多改進和迭代。
如果想要自己來編寫一個generator其實難度也非常小,yeoman官方甚至給出了一個generator-generator來幫助我們創建一個generator,筆者這個不成器的ngtimo也是yo generator給yo出來然後加以養成的 :)。

yeoman generator基本項目結構

不想自己從零開始寫一個generator的話強烈推薦使用yeoman官方的generator-generator先把基本結構構建出來:

npm install -g generator-generator
yo generator

yeoman的generator說白也只是一個npm包,主要依賴yeoman-generator包來制定構建規則,這裡給出ngtimo的基本目錄結構:

構建規則

現在主要著眼於generators/app/index.js,此文件是最主要的角色,定義了ngtimo要如何處理模板,如何與用戶交互等。筆者目前也只是照著比較成熟的generator在使用,存在片面之處還請包涵。

總覽index.js

整個index.js將導出一個擴展了yeoman-generator的類,就像這樣:

const Generator = require('yeoman-generator');
// ...
module.exports = class extends Generator {
  prompting() {
    // ...
  }
  default() {
    // ...
  }
  writing() {
    // ...
  }
  install() {
    // ...
  }
}

內部的這四個方法各有用處。

一、prompting方法

用於與用戶進行交互,即在yo項目的時候,這老頭會啰啰嗦嗦問我們很多問題,這些問題就是在這裡配置的。
對於這個方法筆者選擇的套路是如下三部曲:

  1. 先讓老頭向用戶問聲好

    const yosay = require('yosay');
    // ...
    this.log(yosay(
      'Welcome to the astonishing ' + chalk.red('generator-ngtimo') + ' generator!'
    ));

    以上代碼效果就是老頭會代我們問候(褒義)一下用戶:

  1. 把一連串問題先配置好

    const prompts = [{
      type: 'input',
      name: 'appName',
      message: 'Your project name(你的項目名稱)',
      default: this.appname
    }, {
      type: 'confirm',
      name: 'addCommon',
      message: 'Would you like to add some common code(include CoreModule, SharedModule, Router)?\n(要自動創建額外的常用內容嗎, 包含了核心模塊、共用模塊和路由能力)',
      default: true
    }];
    這裡就列舉了兩類問題,一類是客觀題,讓用戶輸入要構建的項目名稱,另一類是判斷題,詢問用戶是否添加一些額外的常用代碼,還有一類沒有使用到的是選擇題,還蠻有趣的。
  2. 把這個問題數組返回給老頭
    問題數組配置好了,現在要把它交給老頭保管,做法如下:

    return this.prompt(prompts).then(props => {
      // 用戶交互完成後把得到的配置設置到參數中
      this.props = props;
    });

    效果就是當用戶做完這些題目後回答會配置給props變數,在後面的寫如內容環節就可以根據用戶的答案來有選擇的創建項目了。

二、default方法

筆者一開始沒有配置這個方法,是在測試構建時發現沒辦法給目標項目套一個頂層目錄時參考官方generator加上的,猜測是可以用來執行一些預設行為,比如自動給目標項目創建一個頂層目錄,像這樣:

const path = require('path');
const mkdirp = require('mkdirp');
// ...
default() {
  if (path.basename(this.destinationPath()) !== this.props.appName) {
    this.log(
      '發現你不是在 ' + this.props.appName + ' 目錄下構建\n' +
      '我將主動創建此目錄.(created folder with app name)'
    );
    mkdirp(this.props.appName);
    this.destinationRoot(this.destinationPath(this.props.appName));
  }
}
三、writing方法

此方法即用來把實際項目按照指定規則給寫出來,主要有兩種寫法: 直接複製指定模板以及傳入參數渲染出目標文件。

  • 方式一: 直接拷貝

    this.fs.copy(
    this.templatePath('模板位置'),
    this.destinationPath('目標位置')
    );
  • 方式二: 傳入參數渲染模板

    this.fs.copyTpl(
    this.templatePath('模板位置'),
    this.destinationPath('目標位置'),
    {
    參數名: 值
    }
    );
    比如說,在index.js的同級目錄下的templates目錄下有一個文件叫text.txt, 使用方法一將模板位置和目標位置都寫text.txt,老頭就會直接複製這個text.txt作為輸出;而如果使用方法二,模板位置和目標位置不變,並傳入參數{ hello: '你好啊'},在text.txt中就使用ejs語法寫上<%=hello%>,最終老頭同樣會輸出一個test.txt文件,不一樣的是裡面的內容被渲染成了"你好啊"。
    對此方法的總結就是根據需要使用copy或copyTpl進行輸出,其中copyTpl中的渲染使用ejs語法進行,而模板文件就都放在index.js的同級templates目錄裡邊。

四、install方法

此方法即用來自動執行依賴的安裝,沒什麼特別的,就是在構建完成後自動幫你npm install和bower install,也可以禁用其中一種:

install() {
  this.installDependencies({bower: false});
}

效果就是下圖這句話了:

發佈generator到npm

發佈之前可以先使用npm link映射到本地進行測試:

npm link
yo ngtimo

確認無誤後,發佈流程就是一句代碼的事(記得定好版本,且更新發佈時記得更新版本號):

npm publish

總結以及資源整理

以上是這一整天的全部所學,下麵給出可能有用的資源:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前我的旅游網站前端部分只用了HTML+CSS解決,接下來逐步使用更高級的CSS特性和新引入的JavaScript技術來提高網站的交互體驗。 每到進行線上更新的時候,就來記錄一次更新的內容。 ...
  • 介紹常見的排序演算法:冒泡排序、選擇排序、插入排序、歸併排序、快速排序及簡單的性能測試。 ...
  • http://www.jeasyui.com/download/list.php 下載版本1.5.2的easyui中文API,可在CSDN網站http://download.csdn.net/download/tkk_lcm/9932078下載,不過需要有CSND賬號和1個積分才行。 ...
  • 在Reina(視網膜)屏幕的手機上,使用CSS設置的1px的邊框實際會比視覺稿粗很多。在之前的項目中,UI告訴我說我們移動項目中的邊框全部都變粗了,UI把他的設計稿跟我的屏幕截圖跟我看,居然真的不一樣。沒有辦法,只有在後面的版本中去修改了,但是要改的話,需要知道是為什麼。所以查了很多資料,終於搞懂了... ...
  • 超多經典 canvas 實例 普及:<canvas> 元素用於在網頁上繪製圖形。這是一個圖形容器,您可以控制其每一像素,必須使用腳本來繪製圖形。 註意:IE 8 以及更早的版本不支持 <canvas> 元素。 貼士:全部例子都分享在我的 GayHub - https://github.com/bxm ...
  • 一、Flex的簡介 Flex 是 Flexible Box 的縮寫,意為"彈性佈局",用來為盒狀模型提供最大的靈活性。用六個字概括彈性佈局就是簡單、方便、快速。 flex( flexible box:彈性佈局盒模型),是2009年w3c提出的一種可以簡潔、快速彈性佈局的屬性。主要思想是給予容器控制內 ...
  • 在前端項目開發中,px,em,以及rem都是頁面佈局常用的單位,雖然它們是長度單位,但是所含的意義不一樣。通過複習和查閱,總結了以下知識。 px像素(Pixel) 定義:相對長度單位。像素px是相對於顯示器屏幕解析度而言的。(引自CSS2.0手冊) 特點: 1:px代表的是像素,用它設置字體大小時, ...
  • 普通的路人,普通地瞧。簡單粗暴地分析了 Zepto 的 Ajax 模塊,分析時使用的是目前最新 1.2.0 版本。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...