Node.js + TypeScript 寫後端工具

前言

如今 Node.js 的生態愈來愈成熟,有好多公司直接使用 Node 構建其後端應用,放在線上跑。TypeScript 是微軟的編程語言,近年來受到的關注也是愈來愈多。html

做爲一個常年寫後端接口的人,便想:能不能利用這二者,來給本身的工做流,帶來一點不同的感受。(因爲這不是寫客戶端 JS,因此咱們並不須要 webpack 等工具 )前端

步驟

初始化項目node

假設項目目錄是 project 。webpack

cd project

mkdir src && touch README.md

cd src 

npm init

tsc --init

根據慣例,弄一個主入口 main (注:這裏沒有使用 index.js 這種設定 )
touch main.ts
複製代碼

初始化完成的項目是這樣的:web

project/
    README.md
    src/
        package.json
        tsconfig.json
        main.ts
複製代碼

安裝必備的包typescript

目前暫時只想到了以下的這些包:npm

npm install --save lodash @types/lodash

npm install --save @types/node

npm install --save-dev typescript 
複製代碼

以後項目變成這樣子:編程

project/
    README.md
    src/
        package.json
        tsconfig.json
        main.ts
        node_modules/
複製代碼

配置 tsconfig.jsonjson

這一步最爲重要。官網有一節專門講這個:http://www.typescriptlang.org/docs/handbook/tsconfig-json.html 。要看懂仍是須要花點時間的。後端

總而言之,須要告訴 tsc 以下幾件事情:

  1. 項目的根目錄在哪? (以 tsconfig.json 所在的目錄爲根目錄,即項目根目錄 )
  2. 輸入在哪? (即:項目的哪些ts 文件是須要關心的,標準庫/第三方庫去哪裏找)
  3. 輸出在哪?(因爲不是前端項目,因此咱們只須要每個 ts 輸出對應的 js 文件便可)

這裏是一個示例配置,有詳細的註釋說明,初始化 ts 項目時,能夠直接拷貝之,以節約時間成本。

{
    // tsconfig 所在的根目錄, 則是一個project
    "compilerOptions": {
        "module": "commonjs", // 模塊系統
        "target": "es2015",   // 生成目標, 通常選擇ES6,由於不是客戶端環境,不必還編譯成  ES5
        
        // 一組嚴苛的編譯選項
        "noImplicitAny": false,
        "strictNullChecks": true,
        "strict": true,
        "alwaysStrict": true,
        "sourceMap": false,
        "noImplicitReturns": true,
        "noImplicitThis": true,
        "pretty": true,
        
        "listFiles": true,  // 包含了哪些庫,這個必要的時候仍是頗有用的
        "listEmittedFiles": true, 
        "lib": [            // 要那些 lib,按需選擇便可
            "es2016"
        ],
        // "noUnusedLocals": true,
        // "noUnusedParameters": true,
        // "noFallthroughCasesInSwitch": true,
        // 指定庫的搜索路徑,這個比較有用,通常會指定 @types,還能夠按需添加
        "typeRoots": [
            "./node_modules/@types"
        ]
        // 庫搜索路徑下, 僅使用哪些庫, 通常沒啥用
        // "types": [
            
        // ]
    },
    // file include會算出一個交集, 指明哪些是項目的 ts 文件
    "include": [
        "./**/*"
    ],
    // 排除項目下面不符合要求的文件,這個按需設定便可,能夠放心排除亂七八糟的文件
    "exclude": [
        "node_modules",
        "**/*.spec.ts",
        "*.js"
    ]

    
}
複製代碼

設計項目的目錄結構 爲了模擬真實的場景,咱們的 main.ts 有以下內容:

function main() {
  
}

main();
複製代碼

寫一個 utils.ts,放入 src/core/utils.ts 中。

import * as path from 'path';                     // 測試可否正常使用 Node 的內置模塊


/**
 * 一個正常的class
 * 
 * 不得不說, TS 使用起來真是舒服,各類該有的東西都替你考慮到了
 * 很舒心
 */
export class NodeModuleTester {
  public static readonly STATIC_VAR = 'STATIC';   // 測試static變量

  constructor(                                    // 測試構造方法
    private readonly f1: string,
    private readonly f2: number) {

  }

  public static testPath() {                      // 測試靜態方法
    const curdir = './';

    console.log(path.resolve(curdir));
  }

}
複製代碼

因爲須要使用對應的 class,因此 main.ts 內容變成了這樣:

import {NodeModuleTester} from './core/utils';

/**
 * main 入口
 * 
 * 測試!
 */
function main() {
  const tester = new NodeModuleTester("s1", 1);

  console.log(NodeModuleTester.STATIC_VAR);

  console.log(NodeModuleTester.testPath());
}

main();
複製代碼

運行 因爲 Node 是不認識 ts 的,咱們的 ts 代碼須要先轉譯成 js 代碼。

不過別擔憂,咱們使用的是微軟的產品,一切都不是問題(意思就是:微軟設計的東西,既有品味,又是異常簡單好用,從來如此)。

咱們只須要 cd src/ && tsc && node main.js 便可,簡直不要太簡單。若是還嫌麻煩,咱們能夠寫到 npm script 中去,以下:

{
  "name": "src",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "runmain": "./node_modules/.bin/tsc && node main.js"   // 就是這個腳本!
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/node": "^9.4.6",
    "typescript": "^2.7.2"
  }
}

複製代碼

而後咱們只須要cd src/ && npm run runmain便可,更加地簡單。

個人感悟

TypeScript 代碼,既美觀又優雅,加上微軟強大的工程能力(造工具的能力),Node.js + TypeScript 幾乎是一對完美的組合。

  • 有人可能比較擔心有的庫沒有對應 d.ts 。其實這徹底不用擔憂,經常使用的庫要麼自帶 d.ts (側面驗證了 TS已經愈來愈被你們接受),要麼社區已經有維護好的 d.ts (@types下面的庫),實在沒辦法,本身寫 d.ts 也不過是分分鐘的事情,並無什麼難度。
相關文章
相關標籤/搜索