webpack.config.js
const path = require('path'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); module.exports = { entry: './src/index.js', output: { filename: '[name].[hash].js', path: path.resolve(__dirname, 'dist') }, //use inline-source-map for development devtool: 'inline-source-map', //use source-map for production //devtool: 'source-map' devServer: { contentBase: './dist', hot: true }, module: { rules:[ { test: /\.js$/, loader: 'babel-loader', include: [path.resolve(__dirname, 'src')], exclude: [path.resolve(__dirname, 'node-modules')] }, { test: /\.(gif|png|jpe?g|svg)$/, use:[ { loader: 'url-loader', options: { limit: 8000 } },{ loader: 'image-webpack-loader', options: { mozjpeg: { progressive: true, quality: 90 }, optipng: { enabled: true }, pngquant: { quality: '65-90', speed: 4 }, gifsicle: { interlaced: false } } } ] }, { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] } ] }, optimization: { //commonChunkPlugins runtimeChunk: 'single', splitChunks: { //分割代碼塊 cacheGroups: { //緩存組 common: { chunks: 'initial', minSize: 0, minChunks: 2 }, vendor: { priority: 1, test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all', minSize: 0, minChunks: 2 } } } }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ hash: true, template: './src/index.html', filename: 'index.html' }), new webpack.NamedModulesPlugin(),//打印更新的模塊路徑 new webpack.HotModuleReplacementPlugin()//熱更新插件 ] }
.babelrc
{ "presets": [ "@babel/preset-env" ] }