Node.js + TypeScript для написания серверных инструментов

Node.js задняя часть TypeScript Microsoft

предисловие

Теперь, когда экосистема Node.js становится все более и более зрелой, многие компании напрямую используют Node для создания своих серверных приложений и их запуска в Интернете. TypeScript — это язык программирования Microsoft, которому в последние годы уделяется все больше внимания.

Как человек, который пишет внутренние интерфейсы круглый год, я задаюсь вопросом, могу ли я использовать эти два, чтобы привнести немного другое ощущение в свой рабочий процесс. (Поскольку это не написание JS на стороне клиента, нам не нужны такие инструменты, как веб-пакет)

шаг

Инициализировать проект

Предположим, что каталог проекта — это project .

cd project

mkdir src && touch README.md

cd src 

npm init

tsc --init

根据惯例,弄一个主入口 main (注:这里没有使用 index.js 这种设定 )
touch main.ts

Завершенный проект инициализируется следующим образом:

project/
    README.md
    src/
        package.json
        tsconfig.json
        main.ts

Установите необходимые пакеты

На данный момент я могу думать только о следующих пакетах:

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.json

Этот шаг является самым важным. На официальном сайте есть раздел, посвященный этому: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html. Потребуется некоторое время, чтобы понять.

Таким образом, вам нужно сообщить tsc следующие вещи:

  1. Где находится корневой каталог проекта? (В качестве корневого каталога возьмите каталог, в котором находится tsconfig.json, то есть корневой каталог проекта)
  2. Где ввод? (т.е.: о каких файлах ts проекта нужно беспокоиться и где найти стандартную библиотеку/стороннюю библиотеку)
  3. Где выход? (Поскольку это не внешний проект, нам нужно только вывести соответствующий файл js для каждого ts)

Вот пример конфигурации с подробными аннотациями.При инициализации проекта 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));
  }

}

Поскольку необходимо использовать соответствующий класс, содержимое 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.

Но не волнуйтесь, мы используем продукты Microsoft, и это не проблема (имеется в виду: Microsoft, как всегда, разрабатывает вещи, которые одновременно и со вкусом, и на удивление просты в использовании).

нам просто нужноcd src/ && tsc && node main.jsВот именно, это не так просто. Если это все еще слишком сложно, мы можем написать это в сценарии npm следующим образом:

{
  "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, красивый и элегантный, в сочетании с сильными инженерными возможностями Microsoft (возможность создавать инструменты), Node.js + TypeScript — почти идеальное сочетание.

прикрепил

  • Некоторые люди могут быть обеспокоены тем, что некоторые библиотеки не соответствуют d.ts. На самом деле, об этом вообще не нужно беспокоиться: часто используемые библиотеки либо поставляются с d.ts (это подтверждает, что TS становится все более и более приемлемым для всех), либо сообщество уже поддерживает d.ts (т.е. библиотека под @types), на самом деле нет возможности, написать d.ts самостоятельно — дело нескольких минут, и в этом нет никакой сложности.