123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- const { resolve } = require("path");
- //提取css
- const MiniCssExtractPlugin = require('mini-css-extract-plugin');
- //压缩css
- const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
- //js语法检查
- const EsLintPlugin = require('eslint-webpack-plugin')
- //html资源处理
- const HtmlWebpackPlugin = require('html-webpack-plugin')
- //设置node环境变量 postcss-loader会根据它读取package.js里的browserslist配置
- process.env.NODE_ENV = 'development'
- /**
- * 去除无用代码
- * 必须使用es6模块化
- * 开启production环境
- * 减少代码体积
- *
- * 在package.json中配置
- * "sideEffects":false 所有代码都没有副作用,都可以进行tree shaking
- * 可能会把css| @bable | polyfill 文件干掉
- * "sideEffects":["*.css","*.less"] 不会tree shaking
- */
- //复用loader
- const commonCssLoader = [
- MiniCssExtractPlugin.loader, //提取css
- 'css-loader',
- {
- loader: 'postcss-loader', //兼容性处理
- options: {
- // 旧版本配置
- /* ident: 'postcss',
- plugins: () => [
- require('postcss-preset-env')() //读取package.json里browserslist配置,默认加载根据node_env加载production
- ] */
- postcssOptions: {
- plugins: [
- [
- 'postcss-preset-env'
- ],
- ],
- }
- }
- }
- ]
- module.exports = {
- entry: './src/js/index.js',
- output: {
- filename: 'js/built.[contenthash:10].js',
- path: resolve(__dirname, 'build')
- },
- module:{
- rules:[{
- // 以下loader只会匹配一个 提高效率
- // 注意:不能有两个配置处理同一种文件
- oneOf:[
- {
- test:/\.css$/,
- use: [
- ...commonCssLoader
- ]
- },
- {
- test:/\.less$/,
- use:[
- ...commonCssLoader,
- 'less-loader'
- ]
- },
- { //兼容性处理
- test:/\.js$/,
- exclude: /node_modules/,
- loader: 'babel-loader',
- options:{
- // 预设:指示babel做怎样的兼容性处理
- presets:[
- [
- '@babel/preset-env',
- {
- useBuiltIns: 'usage',
- corejs:{
- version:3
- },
- targets:{
- chrome: '60',
- firefox: '60',
- ie:'9',
- safari: '10',
- edge: '17'
- }
- }
- ]
- ],
- //开启babel缓存
- // 第二次构建时,会读取之前的缓存
- cacheDirectory: true
- }
- },
- //处理图片
- {
- test:/\.(jpg|png|jpeg|gif)/,
- loader:'url-loader',
- options:{
- limit:8*1024,
- name:'[hash:10].[ext]',
- outputPath:'imgs',
- esModule: false,
- }
- },
- //html 处理
- {
- test:/\.html$/,
- loader:'html-loader'
- },
- //其他资源处理
- {
- exclude:/\.(js|css|less|html|jpg|jpeg|png|gif)/,
- loader:'file-loader',
- options:{
- outputPath:'media',
- esModule: false,
- name: '[hash:10].[ext]'
- },
- type: 'javascript/auto'
- }
- ]
- }]
- },
- plugins:[
- new MiniCssExtractPlugin({
- filename: 'css/built.[contenthash:10].css'
- }),
- new OptimizeCssAssetsWebpackPlugin(),
- new EsLintPlugin({
- extensions: ['js', 'json', 'coffee'],
- //exclude: '/node_modules/',
- fix:true
- }),
- new HtmlWebpackPlugin({
- template: './src/index.html',
- minify:{
- collapseWhitespace:true,
- removeComments:true
- }
- })
- ],
- mode:'production',
- devtool:'source-map'
- }
|