предисловие
Теперь, когда экосистема 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 следующие вещи:
- Где находится корневой каталог проекта? (В качестве корневого каталога возьмите каталог, в котором находится tsconfig.json, то есть корневой каталог проекта)
- Где ввод? (т.е.: о каких файлах ts проекта нужно беспокоиться и где найти стандартную библиотеку/стороннюю библиотеку)
- Где выход? (Поскольку это не внешний проект, нам нужно только вывести соответствующий файл 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 самостоятельно — дело нескольких минут, и в этом нет никакой сложности.