npm install -D webpack-dev-server
把数据都写在了内存里,而不是硬盘的dist目录
package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --mode development",
"serve": "webpack serve --mode development"
}
这是一个容器,把webpack处理后的文件传递给一个服务器,webpack-dev-server在内部使用了它,也可以进行自定义配置
npm install --save-dev express webpack-dev-middleware
后端node
const express = require('express')
const webpackDevMiddleware = require('webpack-dev-middleware')
const webpack = require('webpack')
const app = express()
// 获取配置文件
const config = require('./webpack.config.js')
const compiler = webpack(config)
app.use(webpackDevMiddleware(compiler))
// 开启端口上的服务
app.listen(3000, () => {
console.log('服务运行在 3000端口上')
})
只对局部发生数据变化的组件进行更新展示,在webpack.config.js中配置devServer,hot属性
module.exports = {
mode: 'development',
devtool: false,
entry: './src/index.js',
output: {
filename: 'js/main.js',
path: path.resolve(__dirname, 'dist')
},
target: 'web',
devServer: {
hot: true
}
}
随便写个title文件就可以监听变化热更新
import './title'
if (module.hot) {
module.hot.accept(['./title.js'], () => {
console.log('title.js模块更新')
})
}
npm install react-hot-loader
https://github.com/gaearon/react-hot-loader
.babelrc
{
"plugins": ["react-hot-loader/babel"]
}
App.js
import { hot } from 'react-hot-loader/root';
const App = () => <div>Hello World!</div>;
export default hot(App);
或者
npm i -D @pmmmwh/react-refresh-webpack-plugin react-refresh
webpack配置文件
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin')
plugins: [
new ReactRefreshWebpackPlugin()
]
babel.config.js
module.exports = {
plugins: [
['react-refresh/babel']
]
}
vue-loader
webpack里面处理Vue文件的时候就处理了热更新
npm install -D vue-loader vue-template-compiler
或者
npm i vue-loader@14 vue-template-compiler -D
vue3 使用正常版本
vue2 使用16版本之前
如果是vue-cli,不需要额外安装,热更新是开箱即用
14版本的vue-loader不需要写plugin
webpack.config.js
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
module: {
rules: [
// ... 其它规则
{
test: /\.vue$/,
loader: 'vue-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
]
}
output: {
filename: 'js/main.js',
path: path.resolve(__dirname, 'dist'),
publicPath: '/lg'
},
devServer: {
hot: true,
publicPath: '/lg',
contentBase: path.resolve(__dirname, 'public'),
watchContentBase: true
}
output中的:这是打包之后的资源输出目录
● publicPath:index.html内部的引用路径,域名+ publicPath + filename
● publicPath如果是’./‘,就变成了相对路径,devServer开启服务不能找到资源,默认情况是空的
● publicPath如果是’/',就是绝对路径,本地打包的无法找到
devServer中的:
● publicPath: 指定本地服务所在的目录
● contentBase: 我们打包之后的资源如果说依赖其它的资源,此时就告知去哪找
● watchContentBase:监听被依赖的未打包其他资源更改
output和devServer里的publicPath要保持一致,devServer里的设置了之后,访问本地服务器要加上设置的值,localhost:8080/lg
如果output不加,则会访问不到打包出来的js
devServer: {
hot: true,
hotOnly: true,
port: 4000,
open: false,
compress: true,
historyApiFallback: true
}
hotOnly:修复语法错误等报错后,只更新修改的地方,而不是整体刷新
port:指定端口
open:启动服务时是否打开浏览器
compress:服务端开始gzip 压缩打包的文件
historyApiFallback:history路由模式下,刷新页面路径请求不到页面404,设置为true,页面替换为index.html,也可以传入对象,配置rewrites属性
devServer: {
hot: true,
proxy: {
// /api/users
// http://localhost:4000/api/users
// https://api.github.com/api/users
'/api': {
target: 'https://api.github.com',
pathRewrite: { "^/api": "" },// http://localhost:8080/api/users -> https://api.github.com/users
changeOrigin: true//修改host为代理的
}
}
}
配置模块如何解析
resolve: {
extensions: [".js", ".json", '.ts', '.jsx', '.vue'], //导入模块少写后缀名
alias: {
'@': path.resolve(__dirname, 'src')
}
}
source-map和之前的一样,webpack5没有大改动
npm i ts-loader -D
webpack配置
{
test: /\.ts$/,
use: ['ts-loader']
}
但是无法处理ts里面写es6新的语法,使用babel-loader来处理TS
npm i @babel/preset-typescript -D
{
test: /\.ts$/,
use: ['babel-loader']
}
babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: 3
}],
['@babel/preset-typescript']
]
}
但是编译时会忽略一些ts语法错误
所以可以在packag.json里新增编译命令,确定没问题了再打包
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "npm run ck && webpack",
"serve": "webpack serve",
"ck": "tsc --noEmit"
}