我们一起来喜欢TypeScript
现在写js不用TypeScript,伦家可能会觉得你是外星人。
是的,TypeScript很大程度增强了代码的可读性,可跟踪性,可维护性和减少了bug。
那么没有理由不适用TypeScript进行js开发,但是回归本质,要根据实际出发,不是盲目的一来直接上TS。
我参与过一些使用TS开发的项目,也发现使用TS出现的问题。
举点例子:
无处不见的any
无视TS
高版本的express已经内置TS, 实际上到处还是any。
app.get("http://www.likecs.com/", function(req: any, res: any) {
res.send("Hello," + data.name);
});
本身一个函数能写完的代码,却写一个class来完成
tslint编译一堆错误,依旧无视
这条倒是其次, 因为很多时候,也许你没有那么多时间去处理这些问题。也说明我们在工程化下的功夫不足。
node和typescript
node + typescript 入门级别的配置真的特别简单。
npm安装typescript
配置tsconfig.json
配置package.json的scripts命令
简单三步,你就可以通过简单的一步npm run xxx,TS文件们就乖乖的变为了js文件。
然后执行node dist/xx.js就能启动你的服务了。
但是,这不是我们所期望的。
我们希望我修改ts文件后,自动编译为js文件,然后启动服务。
我了解的相对较好的有下面三种方式:
ts-node-dev
这个方案是无意中看到的,star并不是特别多,400左右。
ts-node-dev 是基于 ts-node 的。
ts-node 可以直接执行ts文件,是不是很酷。
一句代码就可以监听文件变化,并运行编译后的代码。
~~~
ts-node-dev --respawn app.ts
~~~
我为什么要将Typescript与Express、nodejs一起使用(译文)
TypeScript-Node-Starter
微软这也有一个参考。也有对tslint的支持。
基本思路就是package.json 的scripts。
其主要使用的是 concurrently 和# nodemon。
其package.json的scripts如下:
"scripts": {
"start": "npm run serve",
"build": "npm run build-sass && npm run build-ts && npm run tslint && npm run copy-static-assets",
"serve": "node dist/server.js",
"watch-node": "nodemon dist/server.js",
"watch": "concurrently -k -p \"[{name}]\" -n \"Sass,TypeScript,Node\" -c \"yellow.bold,cyan.bold,green.bold\" \"npm run watch-sass\" \"npm run watch-ts\" \"npm run watch-node\"",
"test": "jest --forceExit --coverage --verbose",
"watch-test": "npm run test -- --watchAll",
"build-ts": "tsc",
"watch-ts": "tsc -w",
"build-sass": "node-sass src/public/css/main.scss dist/public/css/main.css",
"watch-sass": "node-sass -w src/public/css/main.scss dist/public/css/main.css",
"tslint": "tslint -c tslint.json -p tsconfig.json",
"copy-static-assets": "ts-node copyStaticAssets.ts",
"debug": "npm run build && npm run watch-debug",
"serve-debug": "nodemon --inspect dist/server.js",
"watch-debug": "concurrently -k -p \"[{name}]\" -n \"Sass,TypeScript,Node\" -c \"yellow.bold,cyan.bold,green.bold\" \"npm run watch-sass\" \"npm run watch-ts\" \"npm run serve-debug\""
}
TypeScript with Node.js里面提供了更加简单的方法。 nodemon + ts-node
~~~
"scripts": {
"start": "npm run build:live",
"build": "tsc -p .",
"build:live": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/index.ts"
},
~~~
TypeScript-Node-Starter的package.json可以好好看看,具有很好的扩展性。
3. gulp-typescript + gulp-nodemon
gulp-typescript负责编译ts
gulp-nodemon负责启动服务
主要任务就是copy, compile和watch
const gulp = require("gulp");
const ts = require("gulp-typescript");
const nodemon = require('gulp-nodemon')
const del = require('del');
const sourcemaps = require('gulp-sourcemaps');
const tsProject = ts.createProject("tsconfig.json", { noImplicitAny: true });
// 默认任务
gulp.task("default", ["copy", "compile", "watch"], function () {
console.log('started .....')
})
// 复制配置文件
gulp.task('copy', function () {
return gulp.src("./src/config/**/*.json")
.pipe(gulp.dest("./dist/config"))
})
// 编译
gulp.task("compile", function () {
return gulp.src("./src/**/*.ts")
.pipe(sourcemaps.init({ loadMaps: true }))
.pipe(tsProject())
.js
.pipe(sourcemaps.write('./maps'))
.pipe(gulp.dest("dist"));
})
gulp.task('build',['compile','copy'])
// 删除
gulp.task('del', function (cb) {
return del([
'dist/**',
], cb);
});
// 监听变化
gulp.task('watch', ['compile'], function (done) {
var stream = nodemon({
script: 'dist/app.js',
watch: 'src/**',
tasks: ['copy', 'compile'],
done: done,
ext: 'ts html json'
})
return stream
})
使用typescript开发node js
TypeScript with Node.js
-------------------------
ESLint
到这里,我们已经又进了一步。
VSCode本身有插件TSLint插件,而且有新旧版。
ESLint插件默认是 可以读取tslint.json的配置的,如果没有,他有自己的默认配置。
新版的,如果有错误,默认是警告,而不是错误提示。
你去首选项勾选掉:tslint.alwaysShowRuleFailuresAsWarnings即可。
我们是需要添加eslint.json配置的
方便自定义
eslint编译检查,比如你的同事是用txt文件编写的呢。
因此,我们还需要安装tslint包。
还需要在package.json的文件里面添加一个脚本
"tslint": "tslint -c tslint.json -p tsconfig.json",
Prettier