通过express配置开发服务器,通过webpack配置example开发环境。
安装依赖
npm i typescript webpack webpack-dev-middlewarewebpack-hot-middleware ts-loader tslint-loadertslint-loader express body-parser --save-dev
"typescript": "^4.6.4","ts-loader": "^9.3.0","tslint-loader": "^3.5.4","webpack": "^5.72.1","webpack-hot-middleware": "^2.25.1","webpack-dev-middleware": "^5.3.3","express": "^4.18.1","body-parser": "^1.20.0"
webpack配置
const fs = require('fs')const path = require('path')const webpack = require('webpack')/* 配置多入口 */// 读取 webpack.config.js同级目录下的文件夹,遍历const entries = fs.readdirSync(__dirname).reduce((entries, dir) => {const fullDir = path.join(__dirname, dir) // 文件夹全路径const entry = path.join(fullDir, 'app.ts') // app.ts 全路径// statSync:获取文件、文件夹信息if (fs.statSync(fullDir).isDirectory() && fs.existsSync(entry)) {/*文件夹并且文件夹下 app.ts文件存在,返回一个对象,key 为目录名 例如:{simple: ['webpack-hot-middleware/client','D:\chenzeqin\PublicProject\ts-axios\examples\simple\app.ts']}*/entries[dir] = ['webpack-hot-middleware/client', entry]}return entries}, {})module.exports = {mode: 'development',/*** 我们会在 examples 目录下建多个子目录* 我们会把不同章节的 demo 放到不同的子目录中* 每个子目录的下会创建一个 app.ts* app.ts 作为 webpack 构建的入口文件* entries 收集了多目录个入口文件,并且每个入口还引入了一个用于热更新的文件* entries 是一个对象,key 为目录名*/entry: entries,// entry:{// app: path.join(__dirname, './base/app.ts')// },/*** 根据不同的目录名称,打包生成目标 js,名称和目录名一致*/output: {// path: path.join(__dirname, '__build__'),filename: '[name].js',publicPath: '/__build__/'},// devServer: {// contentBase: './__build__',// },module: {// 配置loaderrules: [{test: /\.ts$/,enforce: 'pre',use: [{loader: 'tslint-loader'}]},{test: /\.tsx?$/,use: [{loader: 'ts-loader',options: {transpileOnly: true}}]},{test: /\.css$/,use: ['style-loader', 'css-loader']}]},resolve: {extensions: ['.ts', '.tsx', '.js']},// 配置pluginsplugins: [new webpack.HotModuleReplacementPlugin(),new webpack.NoEmitOnErrorsPlugin(),]}
:::warning 注意:
- publicPath: 配置静态资源的跟路径,如果配置了,index.html script:src 需要加上,如果使用了 html-webpack-plugin,则会自动加上
- 如果使用
webpack-dev-middleware配置开发服务器,如果没有自己写app.use(express.static(__dirname))处理静态文件,会 GET Error - webpack 版本注意要和
html-webpack-plugin兼容 :::配置开发服务器
通过 express 和 webpack服务中间件 webpack-dev-middleware(webpack-server内部也是使用该插件)配置开发服务器。 ```typescript / 开启一个node开发服务器:https://github.com/webpack/webpack-dev-middleware / const express = require(‘express’) const webpack = require(‘webpack’) const webpackDevMiddleware = require(‘webpack-dev-middleware’) const webpackHotMiddleware = require(‘webpack-hot-middleware’) var bodyParser = require(‘body-parser’) const config = require(‘./webpack.config.js’)
const app = express() const router = express.Router() // parse application/json app.use(bodyParser.json())
const compiler = webpack(config)
// 定义一些 api 路由 router.get(‘/simple/get’, (req, res) => { res.json(req.query) }) // more router …
app.use(router)
// Tell express to use the webpack-dev-middleware and use the webpack.config.js // configuration file as a base. app.use( webpackDevMiddleware(compiler, { publicPath: config.output.publicPath // writeToDisk:true, }) )
// 需要在webpack.config.js配置plugins app.use(webpackHotMiddleware(compiler)) // 处理静态资源 app.use(express.static(__dirname))
// Serve the files on port 3000. app.listen(3000, function() { console.log(‘localhost:3000’) })
``
:::warning
注意:<br />用webpack-dev-middleware配置开发服务器,如果没有自己写app.use(express.static(__dirname))`处理静态文件,静态文件请求会 GET Error
:::
