webpack-demo |- package.json |- webpack.config.js |- server.js+ |- DEV-server.js |- /dist |- /src |- data.xml |- icon.png+ |- style.css |- my-font.woff |- my-font.woff2 |- print.js |- index.js |- /node_modules
// webpack.config.jsconst path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin'); // 自动生成页面const CleanWebpackPlugin = require('clean-webpack-plugin'); // 自动清理,清理dist旧文件const webpack = require('webpack');module.exports = { mode: 'development', devtool: 'inline-source-map', // 站点地图,可以输出错误发生所在地 devServer: { contentBase: './dist', // webpack-dev-server在哪里寻找文件 hot: true }, entry: { app: './src/index.js' }, plugins: [ new CleanWebpackPlugin(['dist']), new HtmlWebpackPlugin({ title: 'VISION-CANVAS-L', filename: 'index.html', template: 'view/index.html', }), new webpack.HotModuleReplacementPlugin() // HMR的插件 ], output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist'), publicPath: '/' }, module: { rules: [ { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }, { test: /\.(png|svg|jpg|gif)$/, use: [ 'file-loader' ] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: [ 'file-loader' ] }, { test: /\.(csv|tsv)$/, use: [ 'csv-loader' ] }, { test: /\.xml$/, use: [ 'xml-loader' ] } ], }};
// index.jsimport _ from 'lodash';import './style.css';import Icon from './icon.svg';import Data from './data.xml';import printMe from './print.js';function component() { let element = document.createElement('div'); element.innerHTML = _.join(['Hello', 'webpack'], ' '); element.classList.add('hello'); var myIcon = new Image(); myIcon.src = Icon; element.appendChild(myIcon); var btn = document.createElement('button'); btn.innerHTML = 'Click me and check the console!'; btn.onclick = printMe; element.appendChild(btn); console.log(Data); return element;}// document.body.appendChild(component());let element = component(); // Store the element to re-render on print.js changesdocument.body.appendChild(element);if (module.hot) { module.hot.accept('./print.js', function () { console.log('Accepting the updated printMe module!'); printMe(); document.body.removeChild(element); element = component(); // Re-render the "component" to update the click handler document.body.appendChild(element); })}
// server.jsconst express = require('express');const webpack = require('webpack');const webpackDevMiddleware = require('webpack-dev-middleware');const app = express();const config = require('./webpack.config.js');const compiler = webpack(config);// 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, noInfo: true,}));app.use(require("webpack-hot-middleware")(compiler));// Serve the files on port 3000.app.listen(3000, function () { console.log('Example app listening on port 3000!\n');});
// DEV-server.jsconst webpackDevServer = require('webpack-dev-server');const webpack = require('webpack');const config = require('./webpack.config.js');const options = { contentBase: './dist', hot: true, host: 'localhost'};webpackDevServer.addDevServerEntrypoints(config, options);const compiler = webpack(config);const server = new webpackDevServer(compiler, options);server.listen(5000, 'localhost', () => { console.log('dev server listening on port 5000');});