当前位置: 首页 > 后端技术 > Node.js

使用Typescript开发node.js项目——简单的环境配置

时间:2023-04-03 19:44:17 Node.js

最近在学习typescript的过程中,想到用ts开发node.js项目或许可以。在网上搜索了一下,其实很多开发者已经在这方面进行了实践。在这里,我记录下自己搭建开发环境的简单过程。使用Typescript开发的好处:更严格的类型检查和语法检查。更好地支持ES6/ES2015/ES7(部分)。编译出来的js文件很干净,支持各种代码规范。对于其他人,请参阅文档。准备node.jsv6.9.1或任何新版本,旧版本尚未测试。tsctypescript编译器,使用npm安装:npminstall-gtypescript,目前v2.0.10编辑器:vscode命令行终端:windowscmd特别提示和投诉:安装tsc可能需要翻墙(如果特别慢的话),所以淘宝镜像也可以用。创建一个node.js项目使用npminit在指定目录下构建项目目录。这里我创建了自己的项目目录结构:testTS|---build//编译后的js文件目录|---src//ts文件目录|---static//客户端静态文件||---脚本|||---main.js||----样式|||---样式.css||----assets|---views//html文件目录||---index.html|---package.json|---tsconfig.json编辑tsconfig.json在上面的目录结构中有一个tsconfig.json文件,用来设置ts的编译选项。要获取此文件,可以在项目根目录下使用tsc--init,将自动创建一个.tsconfig.json。编写需要的配置项默认情况下,tsc会使用默认的编译配置编译目录下的所有.ts文件。通过编写tsconfig.json,我们可以配置tsc的编译行为,达到想要的效果:{"compilerOptions":{"module":"commonjs",//指定生成哪个模块系统代码"target":"es6",//目标代码类型"noImplicitAny":false,//表达式和声明中的隐式'any'类型报告错误。"sourceMap":false,//用于调试"rootDir":"./src",//仅用于控制输出目录结构--outDir。"outDir":"./build",//重定向输出目录。"watch":true//以监视模式运行编译器。输出文件在更改时会被监视和重新编译。},"include":["./src/**/*"],"exclude":["views","static"]}配置文件注意"compilerOptions"为编译选项,详见:中文文档和英文文档“module”用于指定编译后的js代码使用哪种模块规范。由于是开发node.js项目,所以选择commonjs。(有兴趣的可以尝试所有模块所有可??能的取值,查看编译出来的js文件的区别,会发现生成的代码还是很好很干净的。)“target”是编译出来的后面的js代码可以是es3/es5/es6等什么规范,这里为了比较ts2.0代码和es6代码的区别,用了“es6”。“rootDir”是一个需要注意的地方,它会告诉编译器这个目录下的文件需要编译。那么,如果设置了这个选项,.ts文件放在外面(比如根目录)会怎么样呢?tsc会提示类似这样的错误:“errorTS6059:File'D:/workplace/nodeWP/testTS/index.ts'isnotunder'rootDir''D:/workplace/nodeWP/testTS/src'.'rootDir'预计将包含所有源文件。”并且,在构建目录下,输出的目录结构也会发生变化:这显然不是我们想要的结果。解决方案是使用包含和排除属性。根据文档,“include”和“exclude”属性指定文件glob匹配模式的列表。表示需要包含的文件目录或文件,以及需要过滤掉的文件或目录(也可以使用"files"配置项,但需要一个一个输入,明确指定的文件通过“files”属性将始终包含,无论“exclude”如何设置。),请参阅官方文档了解详情。因此,在“include”指向的数组中加入“./src/**/*”就可以指定./src下所有我们真正需要编译的文件,其他目录将被排除。“outDir”指向编译后的js代码输出的地方。文档中还有一个“outFile”选项,可以将所有的ts文件按照一定的顺序规则打包成一个文件。详情请参考文档。在这里,我们首先使用outDir。实验写好2个配置文件后,就可以开始编写代码并执行编译了。让我们来做个实验:在./src/server.ts中,写一个简单的:interfaceICache{useCache:boolean;[道具名称:字符串]:任何;}常量缓存:ICache={useCache:true};之后在终端中输入:D:\workplace\nodeWP\testTS>tsc编译后会生成server.js到build目录下//server.jsconstcache={useCache:true};既然要使用.d.ts文件开发项目,显然不只是这些代码。绝对使用内置模块和第三方模块。但是,无法在.ts文件中直接导入模块。例如:这是由于typescript本身的机制,需要一个xx.d.ts声明文件来描述模块暴露的方法和属性的类型和内容。感觉有点麻烦。幸运的是,政府和社区已经制定了解决这个问题的计划。在TypeScript2.0及以上版本中,你只需要使用npm来获取类型声明文件。在项目目录下执行安装:npminstall--save-dev@types/node获取node.jsv6.x的API的类型描述文件。之后就可以顺利导入需要的模块了:import*ashttpfrom'http';完成后,不仅可以正常使用http模块中的方法,而且在vscode中也能得到相应的代码提示。对于内置模块,安装一个@types/node模块可以整体解决模块声明文件的问题。那么,面对海量的第三方模块,我们该怎么办呢?官方和社区也提供了搜索和安装渠道:typingsDefinitelyTypedTypeSearch自动编译重启服务解决了声明文件后,我们其实可以使用ts来简单开发node.js项目了。但是,每次写完或者修改代码,都要重新编译,然后再启动,这是一件小事,但也挺烦人的。为了效率,我们应该改进它。首先,让.ts文件自动编译。这个在上面的tsconfig.json文件中已经设置好了,就是"watch":true。这时,在命令行执行tsc命令后,编译器会不断监听目录下.ts文件的变化,然后自动编译。自动重启节点服务器,我们可以使用supervisor模块来解决,或者任何类似功能的解决方案都可以。npminstall-gsupervisor全局安装supervisor模块,然后在终端中使用supervisor./build/server.js启动服务器,服务器端代码更改后自动重启服务器。让服务的启动更简单由于以上两条命令,在启动的时候可能需要添加一些参数,每次都输入很麻烦。可以使用npmscript来解决。在package.json文件中的"scripts"中,我们设置:{"scripts":{"dev":"supervisor-wbuild./build/server.js","build":"tsc",}}为执行npmrundev后,如果./build目录下的.js文件发生变化,会重启服务器。执行npmrunbuild时,只会编译ts文件,监听ts变化。用一个例子来试验import*ashttpfrom'http';//======================constserver=http.createServer(function(request:http.IncomingMessage,response:http.ServerResponse):void{console.log("创建服务器...");response.writeHead(200,{'Content-Type':'text/plain'});响应。write('Helloworld,我们使用typescript开发。');response.end();});server.listen(3000,function(){console.log("Serverlisteningonport3000");console.log(“测试...”);});补充:一条命令实现tsc编译并重启服务器2017.5.3更新:感谢您对本文的支持。有朋友(@Ajaxyz)建议,有没有办法把ts编译监控和服务器重启合二为一呢?这里提出一个比较简单的方法,使用gulp来管理这两个进程。(如何使用gulp工作,请参考GulpAPI)1、使用gulp的watch()监听ts文件的变化,重启服务器。这种方式需要使用gulp和gulp-typescript插件(安装)需要注意的是:gulp-typescript可能需要在项目目录下安装typescript,所以可以在项目目录下运行命令行:npminstalltypescript准备gulp安装好插件后,需要编写一个gulpfile.js作为gulp项目需要执行的任务文件。示例如下://gulpfile.jsletgulp=require('gulp');让ts=require('gulp-typescript');让tsp=ts.createProject('tsconfig.json');//使用tsconfig.json文件配置tscletexec=require('child_process').exec;让孩子;//目录常量constPATHS={scripts:['./src/**/*.ts'],output:'./build',};//编译ts文件gulp.task('build-ts',['restart'],function(){returngulp.src(PATHS.scripts).pipe(tsp()).pipe(gulp.dest(PATHS。输出));});//监听ts文件变化gulp.task('watch-ts',['build-ts'],function(){gulp.watch(PATHS.scripts,['build-ts']);});//自动重启服务器gulp.task('restart',function(){child=exec('supervisor-wbuild./build/server.js',(error,stdout,stderr)=>{console.log(`标准输出:${标准输出}`);console.log(`stderr:${stderr}`);if(error!==null){console.log(`execerror:${error}`);}});});//开发任务gulp.task('dev',['build-ts','restart','watch-ts']);这样,在开发的时候,直接在项目目录下运行gulpdev就可以启动编译和服务器了,gulp会监听ts文件的变化,然后编译ts文件,重启服务器。刷新页面,可以看到浏览器页面已经输出了新的结果。另外需要注意的是,由于gulp负责监控ts文件的变化,请在tsconfig.json中将watch设置为false或者删除该属性。2.使用tsconfig.json监听ts文件变化,重启服务器。这样,首先打开tsconfig.json监听ts文件,然后修改gulpfile.js文件,如下://...requier部分同上例,这里省略lettsChild,//Monitorts文件修改子进程serverChild;//重启服务器子进程//编译ts文件gulp.task('build-ts',function(){tsChild=exec('tsc',(error,stdout,stderr)=>{console.log(`tsc====>stdout:${stdout}`);console.log(`tsc====>stderr:${stderr}`);if(error!==null){console.log(`execerror:${错误}`);}});});//自动重启服务器gulp.task('restart',function(){serverChild=exec('supervisor-wbuild./build/server.js',(error,stdout,stderr)=>{console.log(`restart=====>stdout:${stdout}`);console.log(`restart=====>stderr:${stderr}`);if(error!==null){console.log(`执行错误:${error}`);}});});//开发任务gulp.task('dev2',['build-ts','restart']);润谷lpdev2,效果和前面的例子一样。提供解决方案和思路,仅供参考。如果在实际环境中使用,功能还需要进一步完善。结束语本文只是对搭建typescript开发node.js项目环境的简单调研和记录。起初我是这样想的,只是好奇我是否能做到。事实上,在node.js稳定版本v6.9.1中支持90%的ES6。因此,直接使用ES6开发node.js项目是一个不错的选择。不足之处请见谅,稍后补充。参考Typescript中文手册gulpgulp-typescriptgulp-typescript简单使用