深入浅出TypeScript(2)- 用TypeScript创建web项目
前言
在第一篇中,我们简单介绍了TypeScript的一些简单语法,那么如果我们只是简单使用TypeScript开发一个web项目,应该做哪些准备?接下来我们就结合TypeScript和Webpack来创建一个基于TypeScript的Web应用程序。
准备工作
为了创建第一个Web应用,我们先做一些基本的准备工作,需要安装以下依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | webpack webpack-cli webpack-dev-server webpack-merge html-webpack-plugin clean-webpack-plugin typescript ts-loader jest & @types/jest |
创建项目
新建文件夹ts-init,npm init -y初始化package.json文件。
之后,我们依次安装上述依赖到项目中,以下是安装之后的package.json文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | { "name" : "ts-init" , "version" : "1.0.0" , "description" : "" , "main" : "./src/index.ts" , // 设置入口文件 "scripts" : { "start" : "webpack-dev-server --mode=development --config ./build/webpack.config.js" , //设置启动命令 "build" : "webpack --mode=production --config ./build/webpack.config.js" , // 配置build命令 "test" : "jest" }, "keywords" : [], "author" : "" , "license" : "ISC" , "devDependencies" : { "@types/jest" : "^24.0.18" , "clean-webpack-plugin" : "^3.0.0" , "html-webpack-plugin" : "^3.2.0" , "jest" : "^24.9.0" , "ts-jest" : "^24.0.2" , "ts-loader" : "^6.0.4" , "typescript" : "^3.5.3" , "webpack" : "^4.39.2" , "webpack-cli" : "^3.3.7" , "webpack-dev-server" : "^3.8.0" , "webpack-merge" : "^4.2.1" } } |
接下来我们按照package.json创建src和build目录,目录结构如下:
让我们引入来创建webpack文件,我们创建在build目录下面。
为了保证我们可以按照develop和production方式来编译,我们创建了四个个webpack文件,如下所示
其中,主配置文件为webpack.config.js:
1 2 3 4 5 6 7 8 9 10 11 | const merge = require( 'webpack-merge' ) const baseConfig = require( './webpack.base.config' ) const devConfig = require( './webpack.dev.config' ) const proConfig = require( './webpack.pro.config' ) // const config = process.env.NODE_ENV === 'development' ? devConfig : proConfig module.exports = (env, argv) => { let config = argv.mode === 'development' ? devConfig : proConfig; // 通过不同的环境,我们运行不同的webpack文件 return merge(baseConfig, config); }; |
提取的基础配置为webpack.base.config.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | const HtmlWebpackPlugin = require( 'html-webpack-plugin' ) module.exports = { entry: { 'app' : './src/index.ts' // 入口文件 }, output: { filename: '[name].[chunkhash:8].js' // 编译的文件以名字.hash值结尾 }, resolve: { extensions: [ '.js' , '.ts' , '.tsx' ] }, module: { rules: [ { test: /\.tsx?$/i, use: [{ loader: 'ts-loader' }], exclude: /node_modules/ } ] }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' // 启动HTML文件 }) ], optimization: { // 简单拆包 splitChunks: { chunks: 'all' } } } |
开发环境配置为webpack.dev.config.js:
1 2 3 | module.exports = { devtool: 'cheap-module-eval-source-map' // 开发环境我们只添加 忽略列信息的ts源码的sourcemap } |
生产环境配置为webpack.pro.config.js:
1 2 3 4 5 6 7 | const { CleanWebpackPlugin } = require( 'clean-webpack-plugin' ) module.exports = { plugins: [ new CleanWebpackPlugin() // 生产环境我们只先添加build清除文件,用来清除每次build产生的hash文件,避免因为无用文件导致打包过大 ] } |
接下来,我们在src文件夹下编写HTML文件模板,我们创建一个div用来承载单页应用的内容:
1 2 3 4 5 6 7 8 9 10 11 12 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <meta name= "viewport" content= "width=device-width, initial-scale=1.0" > <meta http-equiv= "X-UA-Compatible" content= "ie=edge" > <title>TypeScript</title> </head> <body> <div class = "app" ></div> </body> </html> |
我们src文件夹下面简单编写一个index.ts文件,写入hello world程序
1 2 | let str: string = 'Hello TypeScript' document.querySelectorAll( '.app' )[0].innerHTML = str |
ok,一切工作都已经准备完毕,一个ts编写的web程序基本项目已经被我们创建
运行
在命令行我们输入:npm start命令,程序默认运行路径为:http://localhost:8080/,我们在自己浏览器打开网址,发现我们的程序运行成功了:
添加Jest单元测试
现在为我们的项目添加简单的单元测试。
我们首先在src模块下面创建一个普通的模块math.ts,里面包括加法和减法两个方法,我们将会对这两个方法做简单的单元测试:
1 2 3 4 5 6 7 8 9 10 11 12 | function add(a: number, b: number) { return a + b; } function sub(a: number, b: number) { return a - b; } module.exports = { add, sub } |
接下来我们在test文件夹下创建测试文件math.test.ts:
1 2 3 4 5 6 7 8 9 | const math = require( '../src/math' ); test( 'add: 1 + 1 = 2' , () => { expect(math.add(1, 1)).toBe(2); }) test( 'sub: 10 - 1 = 9' , () => { expect(math.sub(10, 1)).toBe(8); }) |
我们运行test命令:npm test,运行结果如下:
由上报错可知,我们test文件写错了,10 -1我们写成了希望=8,我们修改一下test文件:
1 2 3 4 5 6 7 8 9 | const math = require( '../src/math' ); test( 'add: 1 + 1 = 2' , () => { expect(math.add(1, 1)).toBe(2); }) test( 'sub: 10 - 1 = 9' , () => { expect(math.sub(10, 1)).toBe(9); // 修改成9 }) |
继续运行npm test:
由上可知,我们测试通过了。
到此为止,我们的一个简单地可用TypeScript项目开发的Web程序就创建完毕了。
结尾
TypeScript应用非常简单,我们只需要做简单的配置,就可以让项目运行起来,TypeScript的类型系统会帮助我们做类型检查,减少我们的边界值错误几率,可以大大增强我们的开发体验。
同时,TypeScript的测试也很简单,用Jest我们可以做到对项目的单元测试,使我们的代码更可靠和更安全。
简单的项目已经被我上传至github:https://github.com/qixingduanyan/ts-web
我的博客地址:http://www.gaoyunjiao.fun/?p=119
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?