基本配置
const path = require('path');// 基础配置const config = { entry: path.resolve(__dirname, 'src/index.js') || ['@babel/polyfill', path.resolve(__dirname, 'src/index.js')], outputPath: path.resolve(__dirname, 'build'), port: 8080, htmlTemplate: path.resolve(__dirname, 'src/index.html')};// PLUGIN 插件const HtmlWebpackPlugin = require('html-webpack-plugin'), MiniCssExtractPlugin = require('mini-css-extract-plugin'), // 优化css资源的插件 OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin'), // 优化js资源插件 UglifyJsWebpackPlugin = require('uglifyjs-webpack-plugin'), Webpack = require('webpack');let htmlPlugin = new HtmlWebpackPlugin({ // 指定编译得文件 template: config.htmlTemplate, // 编译后得文件名 filename: 'index.html', // 文件压缩 minify: { // 去除空格 collapseWhitespace: true, // 去除注释 removeComments: true, // 去除标签中的双引号 removeAttributeQuote: true, // 去除设置的属性值为 undefined 的值 removeEmptyAttributes: true } }), miniCssPlugin = new MiniCssExtractPlugin({ filename: 'main.css' }), optimizeCssPlugin = new OptimizeCssAssetsWebpackPlugin(), uglifyJsPlugin = new UglifyJsWebpackPlugin({ cache: true, // 是否使用缓存 parallel: true, // 是否并发编译 sourceMap: true // 启动源码映射 }), // 向每一个模块注入全局变量 webpack = new Webpack.ProvidePlugin({});// LOADER 加载器const cssLoader = { test: /\.(css|less)$/i, // 使用加载器 use: [ // 'style-loader', MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', { loader: 'less-loader', options: {} } ], exclude: /node_modules/, include: path.resolve(__dirname, 'src') }, jsLoader = { test: /\.js$/i, use: [ { loader: 'babel-loader', options: { // ES6 -> ES5 presets: ['@babel/preset-env'], plugins: [ ['@babel/plugin-proposal-class-properties', {"loose": true}], ['@babel/plugin-proposal-decorators', {"legacy": true}], ['@babel/plugin-transform-runtime'] ] } } ], exclude: /node_modules/, include: path.resolve(__dirname, 'src') }, imgLoader = { test: /\.(png|jpg|peng|webp|gif|bmp|ico)$/i, use: [{ loader: 'url-loader', options: { // 小于 200kb, 处理为base64 limit: 200 * 1024, outputPath: 'images' } }] }, // 处理HTML文件中使用img元素引入的图片 htmlImgLoader = { test: /\.(html|htm|xml)$/i, use: ['html-withimg-loader'] };module.exports = { // 环境 development production mode: 'production', // 入口 entry: config.entry, // 出口 output: { publicPath: './', // 文件名 filename: 'bundle.min.[hash:8].js', // 输出路径 path: config.outputPath }, // 设置优化项 optimization: { // 压缩优化 minimizer: [ optimizeCssPlugin, uglifyJsPlugin ] }, // webpack-dev-server devServer: { // 创建服务指定的端口号 port: config.port, // 打包显示进度条 progress: true, // 指定当前服务处理资源的目录 contentBase: config.outputPath, // 自动打开浏览器 open: true }, // plugins plugins: [ htmlPlugin, miniCssPlugin, webpack ], // loader 模块加载器 module: { rules: [ cssLoader, jsLoader, imgLoader, htmlImgLoader ] }};
- package.json
{
"name": "webpack-app",
"version": "1.0.0",
"description": "webpack学习",
"main": "./src/index.js",
"scripts": {
"dev": "webpack --config webpack.config.dev.js",
"pro": "webpack --config webpack.config.pro.js",
"server": "webpack-dev-server --config webpack.config.dev.js"
},
"keywords": [
"webpack"
],
"author": "korealu",
"license": "ISC",
"browserslist": [
"> 1%",
"last 2 versions"
],
"devDependencies": {
"@babel/core": "^7.8.4",
"@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/plugin-proposal-decorators": "^7.8.3",
"@babel/plugin-transform-runtime": "^7.8.3",
"@babel/preset-env": "^7.8.4",
"autoprefixer": "^9.7.4",
"babel-loader": "^8.0.6",
"css-loader": "^3.4.2",
"eslint": "^6.8.0",
"eslint-loader": "^3.0.3",
"expose-loader": "^0.7.5",
"file-loader": "^5.0.2",
"html-webpack-plugin": "^3.2.0",
"html-withimg-loader": "^0.1.16",
"less": "^3.11.1",
"less-loader": "^5.0.0",
"mini-css-extract-plugin": "^0.9.0",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"postcss-loader": "^3.0.0",
"style-loader": "^1.1.3",
"uglifyjs-webpack-plugin": "^2.2.0",
"url-loader": "^3.0.0",
"webpack": "^4.41.6",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3"
},
"dependencies": {
"@babel/polyfill": "^7.8.3",
"@babel/runtime": "^7.8.4"
}
}