通过express、webpack-dev-middleware、webpack-hot-middleware(通过EventSource实现HMR)
webpack.dev.js
const path = require('path');
const webpack = require('webpack');
const merge = require('webpack-merge');
const baseConfig = require('./webpack.base.js')
const DEV_SERVE_CONFIG = {
HOST: '127.0.0.1',
PORT: 9002,
MAR_PATH: '__webpack_hmr',
TIMEOUT: 20000
}
Object.keys(baseConfig.entry).forEach(v => {
if (v !== 'vendor') {
baseConfig.entry[v] = [
baseConfig.entry[v],
`webpack-hot-middleware/client?path=http://${DEV_SERVE_CONFIG.HOST}:${DEV_SERVE_CONFIG.PORT}/${DEV_SERVE_CONFIG.MAR_PATH}&timeout=${DEV_SERVE_CONFIG.TIMEOUT}&reload=true`
]
}
})
const webpackConfig = merge(baseConfig, {
mode: 'development',
devtool: 'inline-source-map',
output: {
filename: 'js/[name]_[chunkhash:8].bundle.js',
path: path.resolve(process.cwd(), './app/public/dist/dev/'),
publicPath: `http://${DEV_SERVE_CONFIG.HOST}:${DEV_SERVE_CONFIG.PORT}/public/dist/dev/`,
globalObject: 'this'
},
plugins: [
new webpack.HotModuleReplacementPlugin({
multiStep: false
})
]
})
module.exports = {
webpackConfig,
DEV_SERVE_CONFIG
}
dev.js
const express = require('express');
const path = require('path');
const consoler = require('consoler');
const webpack = require('webpack');
const devMiddleware = require('webpack-dev-middleware');
const hotMiddleware = require('webpack-hot-middleware');
const {
webpackConfig,
DEV_SERVE_CONFIG
} = require('./config/webpack.dev.js');
const app = express();
const complier = webpack(webpackConfig);
app.use(express.static(path.join(__dirname, '../public/dist')));
app.use(devMiddleware(complier, {
// 落地文件,过滤掉tpl文件,不需要落地到内存中
writeToDisk: (filePath) => filePath.endsWith('.tpl'),
publicPath: webpackConfig.output.publicPath,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET,POST,DELETE,PUT,OPTIONS,OPTIONS',
'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type, Authorization',
},
stats: {
colors: true
}
}))
app.use(hotMiddleware(complier, {
path: `/${DEV_SERVE_CONFIG.MAR_PATH}`,
log: () => {
consoler.info('热更新成功')
}
}))
consoler.info('请等待webpack初次构建完成提示....')
const port = DEV_SERVE_CONFIG.PORT;
app.listen(port, () => {
console.log(`webpack dev server is running at http://localhost:${port}`);
});