成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Typescript 構(gòu)建命令行工具上手指南

TNFE / 2880人閱讀

摘要:最近發(fā)布了進(jìn)行對(duì)里冗余文件的清理,但項(xiàng)目由寫成,于是我移植了一個(gè)版本。項(xiàng)目由構(gòu)建,發(fā)布時(shí)自動(dòng)轉(zhuǎn)譯成,因此可以隨意使用等等最新語(yǔ)法和類型檢測(cè)。

這篇小教程里演示使用 TypeScript 構(gòu)建命令行工具,利用 async/await 進(jìn)行非阻塞操作,利用 mocha 自動(dòng)化測(cè)試以及 travis-ci 進(jìn)行持續(xù)集成。

Intro

最近 TJ 發(fā)布了 node-prune 進(jìn)行對(duì) node_modules 里冗余文件的清理,但項(xiàng)目由 Go 寫成,于是我移植了一個(gè) JavaScript 版本。可以搭配源碼配合繼續(xù)閱讀文章。項(xiàng)目由 TypeScript 構(gòu)建,npm 發(fā)布時(shí)自動(dòng)轉(zhuǎn)譯成 JavaScript,因此可以隨意使用 async/await 等等最新語(yǔ)法和類型檢測(cè)。同時(shí)利用 ts-node直接在 TypeScript 環(huán)境下進(jìn)行調(diào)試。項(xiàng)目代碼量很少,適合作為類似小工具的模版~

TypeScript Setup

項(xiàng)目最終的結(jié)構(gòu)如下,源碼放在 src/ 目錄下,最終轉(zhuǎn)碼到 lib/ 目錄發(fā)布到 npm,test/目錄下是測(cè)試代碼。

.
├── src/
├── test/
├── lib/
├── node_modules/
├── LICENSE
├── README.md
├── package-lock.json
├── package.json
└── tsconfig.json

首先使用 npm init 進(jìn)行項(xiàng)目的初始化并安裝 TypeScript

npm i typescript -D

輸入完畢后打開(kāi) package.json 添加:

{
    "scripts": {
        "build": "tsc",
        "dev": "tsc -w",
        "prepare": "npm run build",
    }
},

tsc 是 TypeScript 轉(zhuǎn)譯的命令,-w 參數(shù)可以觀察源碼的變化持續(xù)轉(zhuǎn)譯,prepare 指令會(huì)在 npm installnpm publish 之前執(zhí)行,用來(lái)保證發(fā)布時(shí)是最新轉(zhuǎn)譯的代碼。

為了告訴 tsc 如何進(jìn)行轉(zhuǎn)譯,需要一個(gè)配置文件 tsconfig.json,在命令行 tsc --init 可以生成一個(gè)默認(rèn)的模版。如果要支持 Node6.x, 7.x,修改 "target": "ES2015",對(duì)于 Node 項(xiàng)目。模塊生成需要 "module": "commonjs",之后指定以下包含的 ts 文件即可。

{
  "compilerOptions": {
    "target": "ES2015",
    "module": "commonjs",
    "outDir": "./lib",
    "strict": true
  },
  "exclude": [
    "node_modules",
    "lib"
  ],
  "include":[
    "src/**/*.ts"
  ]
}

現(xiàn)在我們就可以愉快地寫 TS 代碼啦,試驗(yàn)一下寫一個(gè) walk 所有文件和文件夾的函數(shù),

import * as fs from "fs-extra";
import * as path from "path";

export async function walk(dir: string, prunerF: (p: string, s: fs.Stats) => void): Promise {
  let s = await fs.lstat(dir);
  if (!s.isDirectory()) return;

  const items = await fs.readdir(dir);
  for (let item of items) {
    const itemPath = path.join(dir, item);
    const s = await fs.lstat(itemPath);
    const pruned = await prunerF(itemPath, s);
    if (!pruned && s.isDirectory()) {
      await walk(itemPath, prunerF);
    }
  }
}

注意這里我們可以直接使用 async/await,并對(duì)傳入?yún)?shù)進(jìn)行類型標(biāo)記,如果你使用有插件支持的編輯器,這時(shí)可以感受到智能補(bǔ)全帶來(lái)的愉快體驗(yàn)了。

npm build 一下可以在 lib/ 里面看到轉(zhuǎn)譯出來(lái)的 ES2015 代碼,稍微看一眼,可以發(fā)現(xiàn) async 是通過(guò)定義了一個(gè) __awaiter 函數(shù)來(lái)進(jìn)行的,感興趣的同學(xué)可以自行研究。

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
CLI

通過(guò) node file.js 可以運(yùn)行一個(gè)腳本,但要怎樣安裝一個(gè) npm 的可執(zhí)行文件呢,根據(jù) npmjs.com 的描述,在 package.json 中添加

{
    "bin": {
        "prune": "lib/cli.js"
    }
}

之后就可以安裝一個(gè) prune 到系統(tǒng)路徑中,而執(zhí)行的文件頂部需要添加 #!/usr/bin/env node,否則不會(huì)被識(shí)別為 Node 腳本。

為了讀取命令行傳入的參數(shù),可以使用 args,在 src/cli.ts 中這段代碼

const argv = yargs
  .usage("Prune node_modules files and dependencies

Usage: node-prune ")
  .option("config", {
    alias: "c",
    description: " config file name",
    default: ".prune.json",
    type: "string"
  })
  .option("dryrun", {
    alias: "d",
    description: "dry run",
    default: "false",
    type: "boolean"
  })
  .option("verbose", {
    description: "log pruned file info",
    default: "false",
    type: "boolean"
  })
  .help("help").alias("help", "h")
  .version("version", "0.1.0").alias("version", "v")
  .argv;

const path = argv._[0] || "node_modules";
const configs = {
  config: argv.config,
  dryrun: argv.dryrun,
  verbose: argv.verbose
};

可以生成這樣的結(jié)果:

$ prune -h
Prune node_modules files and dependencies

Usage: node-prune 

Options:
  --config, -c    config file name   [string] [default: ".prune.json"]
  --dryrun, -d   dry run                            [boolean] [default: "false"]
  --verbose      log pruned file info               [boolean] [default: "false"]
  --help, -h     Show help                                             [boolean]
  --version, -v  Show version number                                   [boolean]

獲取參數(shù)后就可以 import 你寫的業(yè)務(wù)代碼進(jìn)行操作,這里略去,可以在 Github 看一下例子。

之后我們可以通過(guò) npm publis 發(fā)布后 npm install -g pruner-cli 下載安裝工具之后執(zhí)行 prune 直接調(diào)用。

Async Test

測(cè)試代碼同樣需要使用 TypeScript 以及 async/await。選用 mocha 進(jìn)行 BDD 風(fēng)格的測(cè)試。chai 是一個(gè) assertions 庫(kù),搭配使用效果佳。

$ npm install mocha ts-node -g
$ npm install mocha chai ts-node --save-dev

正常使用 mocha 會(huì)在 test/ 目錄下執(zhí)行 JavaScript,為了跳過(guò)轉(zhuǎn)譯直接測(cè)試 TS 代碼,我們可以綁定 ts-node 直接執(zhí)行測(cè)試代碼,在 package.json 中加入:

{
    "scripts": {
        "test": "mocha -r ts-node/register test/**/*.spec.ts"
    },
}

于是 test/ 下所有的 *.spec.ts 都會(huì)被測(cè)試,并且可以使用 await 異步,expect 實(shí)現(xiàn) BDD。一個(gè)例子。

Travis

在項(xiàng)目下添加 .travis.yml 后添加項(xiàng)目語(yǔ)言的配置

language: node_js
node_js:
  - "6"
  - "7"
  - "8"
  - "9"

然后在 https://travis-ci.org/ 添加自己開(kāi)源的項(xiàng)目就可以在每次 push 時(shí)自動(dòng)測(cè)試編譯和 test。

點(diǎn)擊 build|passing 后將圖片的鏈接貼到項(xiàng)目的 README 中就可以在 Github 上顯示 CI 的狀態(tài)了!

原文地址

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90082.html

相關(guān)文章

  • 2019 - Web開(kāi)發(fā)技術(shù)指南和趨勢(shì)

    摘要:以下內(nèi)容來(lái)自我特別喜歡的一個(gè)頻道這是一個(gè)年你成為前端,后端或全棧開(kāi)發(fā)者的進(jìn)階指南你不需要學(xué)習(xí)所有的技術(shù)成為一個(gè)開(kāi)發(fā)者這個(gè)指南只是通過(guò)簡(jiǎn)單分類列出了技術(shù)選項(xiàng)我將從我的經(jīng)驗(yàn)和參考中給出建議首選我們會(huì)介紹通用的知識(shí)最后介紹年的的一些趨勢(shì)基礎(chǔ)前端開(kāi) 以下內(nèi)容來(lái)自我特別喜歡的一個(gè)Youtube頻道: Traversy Media 這是一個(gè)2019年你成為前端,后端或全棧開(kāi)發(fā)者的進(jìn)階指南: 你...

    sourcenode 評(píng)論0 收藏0
  • 使用 TypeScript 改造構(gòu)建工具及測(cè)試用例

    摘要:第一個(gè)完全使用重構(gòu)的純項(xiàng)目已經(jīng)上線并穩(wěn)定運(yùn)行了。測(cè)試用例的改造前邊的改為大多數(shù)原因是因?yàn)閺?qiáng)迫癥所致。但是測(cè)試用例的改造則是一個(gè)能極大提高效率的操作。 最近的一段時(shí)間一直在搞TypeScript,一個(gè)巨硬出品、賦予JavaScript語(yǔ)言靜態(tài)類型和編譯的語(yǔ)言。 第一個(gè)完全使用TypeScript重構(gòu)的純Node.js項(xiàng)目已經(jīng)上線并穩(wěn)定運(yùn)行了。 第二個(gè)前后端的項(xiàng)目目前也在重構(gòu)中,關(guān)于前...

    Cristic 評(píng)論0 收藏0
  • 前端每周清單第 45 期: Safari 支持 Service Worker, Parcel 完整教

    摘要:的另一個(gè)核心特性,蘋果表示也正在開(kāi)發(fā)中,按開(kāi)發(fā)進(jìn)度可能幾個(gè)月后就能與我們見(jiàn)面。是基于的本地化數(shù)據(jù)庫(kù),支持以及瀏覽器環(huán)境。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn);分為新聞熱點(diǎn)、開(kāi)發(fā)教程、工程實(shí)踐、深度閱讀、開(kāi)源項(xiàng)目、巔峰人生等欄目。歡迎關(guān)注【前端之巔】微信公眾號(hào)(ID: frontshow),及時(shí)獲取前端每周清單。 本期是 2017 年的最后一...

    趙春朋 評(píng)論0 收藏0
  • Ionic2入坑基礎(chǔ)教程和安裝指南

    摘要:安裝程序主要通過(guò)命令行工具來(lái)創(chuàng)建和開(kāi)發(fā),并使用來(lái)構(gòu)建和部署為原生應(yīng)用程序?;A(chǔ)教程確保完成之前的安裝并測(cè)試啟動(dòng)成功。 安裝Ionic Ionic 2 程序主要通過(guò)Ionic命令行工具CLI來(lái)創(chuàng)建和開(kāi)發(fā),并使用Cordova來(lái)構(gòu)建和部署為原生應(yīng)用程序。也就是說(shuō)我們需要先安裝一些工具來(lái)實(shí)現(xiàn)程序開(kāi)發(fā)。 安裝Ionic CLI 和 Cordova 要?jiǎng)?chuàng)建 Ionic 2 項(xiàng)目,你需要安裝最新版...

    jayce 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<