美文网首页
webpack4简易配置

webpack4简易配置

作者: 清苑折纸 | 来源:发表于2021-09-06 09:51 被阅读0次

    安装webpack@4 webpack-cli@3 webpack-dev-server@3

    plugin插件:

    • html-webpack-plugin
    • mini-css-extract-plugin //抽离css
    • optimize-css-assets-webpack-plugin //压缩css
    • uglifyjs-webpack-plugin //压缩js
    • cleanWebpackPlugin //可在打包前删除dist文件夹
    • copyWebpackPlugin //复制文件夹内文件至指定打包文件
    • bannerPlugin 内置模块 //在文件开头加上备注信息

    loader:

    =======处理样式文件=========
    • css-loader //解析@import语法
    • style-loader //把css插入到head标签中
    • less-loader //将less转为css
    • postcss-loader autoprefixer //自动添加css前缀,需要配置postcss.config,js文件
    ========处理js文件==========
    • babel-loader @babel/core @babel/preset-env //js处理,es6转es5
    • @babel/polyfill //重写不能实现的高级语法,在js内require('@babel/polyfill')
    • @babel/plugin-transform-runtime //抽离公共js部分
    • eslint eslint-loader //js语法检测
    =========处理图片========

    图片的引入方式:
    1.js中创建
    2.css中background引入
    3.img标签引入

    • file-loader //默认会在内部生成一张图片,并把图片名字返回,需要使用import将图片引入import bgc form './bgc.png'
    • html-withimg-loader //解析html内的图片
    • url-loader //设置文件小于多少k时使用base64解析
    ========映射文件配置========
    • devtool//增加映射文件
      'source-map' //源码映射,会单独生成一个.map文件,出错了会标识当前报错的行和列
      'eval-source-map' //不会生成单独的文件但可以显示错误的行和列
      'cheap-module-source-map' //不会产生列,但是是一个单独的文件
      'cheap-module-eval-source-map' //不会生成文件,集成在打包文件中,不会产生列(不提示具体位置)
    ==========跨域============

    跨域
    devServer.proxy内配置,但仅开发环境可用

    ==========区分不同环境===========

    区分不同的环境,可以建3个webpack配置文件,一个基础的,一个开发一个生产,使用webpack-merge合并

    仅一个配置文件时
    const path = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    const MiniCssExtractPlugin = require("mini-css-extract-plugin"); //抽离css
    const OptimizeCss = require("optimize-css-assets-webpack-plugin"); //压缩css
    const UglifyjsWebpackPlugin = require("uglifyjs-webpack-plugin"); //压缩js
    const {CleanWebpackPlugin} = require('clean-webpack-plugin') //删除打包后的文件夹dist
    const CopyWebpackPlugin = require('copy-webpack-plugin') //复制文件至指定打包后文件夹
    const webpack = require('webpack')
    
    module.exports = {
        mode: "development", //模式默认两种development、production
        //===========单入口==========
        entry: "./src/index.js", 
        output: {
            path: path.resolve(__dirname, "dist"), //路径必须是一个绝对路径,resolve将路径转为绝对路径
            filename: "[name].bundle[chunkhash:8].js", //打包后的文件,hash戳显示hash长度为8,name为路由懒加载时的webpackchunkname
            //路由配置格式为 component: () => import(/* webpackChunkName: "notFound" */'@/views/404.vue')
            // publicPath: 'http://localhost:8080' //所有文件打包的公共路径
        },
        //=============多入口===========
        // entry: {
        //     home: './src/index.js',
        //     other: './src/other.js'
        // },
        // output: {
        //     filename: '[name].[hash:8].js',
        //     path: path.resolve(__dirname, 'dist')
        // },
        // plugins: [ //多页面
        //     new HtmlWebpackPlugin({
        //         template: './index.html',
        //         filename: 'home.html',
        //         chunks: ['home'] //需要引入的文件 
        //     }),
        //     new HtmlWebpackPlugin({
        //         template: './index.html',
        //         filename: 'other.html',
        //         chunks: ['other']
        //     }),
        // ],
        devServer: {
            port: 8080,
            hot: true,
            open: true,
            contentBase: "./dist", //默认打开文件夹路径
        },
        module: {
            //模块
            rules: [
                //规则
                {
                    //css-loader解析@import语法
                    //style-loader是把css插入到head标签中
                    //less-loader将less转为css
                    //多个loader使用数组,单个laoder使用字符串
                    //loader顺序是从右向左,从下至上执行
                    test: /\.css$/,
                    use: {
                        loader: ["style-loader", "css-loader"],
                    },
                    //loader也可以写成对象的形式,此时可以向其配置属性
                    // use: [
                    //==================将css文件放在style标签内===========
                    //     {
                    //         loader: 'style-loader',
                    //         options: {
                    //             insertAt: 'top'
                    //         }
                    //     },
                    //     'css-loader'
                    // ]
                    //==================将css文件抽离出来===========
                    // use: [
                    //     MiniCssExtractPlugin.loader, //将css抽离出来放到link标签内
                    //     'css-loader'
                    // ]
                },
                {
                    test: /\.less$/,
                    use: [
                        MiniCssExtractPlugin.loader,
                        "css-loader",
                        "postcss-loader",
                        "less-loader",
                    ],
                },
                {
                    test: /\.js$/, //normal 普通顺序的loader
                    exclude: /(node_modules|bower_components)/,
                    use: {
                        loader: "babel-loader",
                        options: {
                            presets: [
                                "@babel/preset-env", //es6转es5
                                "@babel/plugin-transform-runtime", //抽离公共部分
                            ],
                        },
                    },
                },
                {
                    test: /\.js$/,
                    use: {
                        loader: "eslint-loader", //校验js eslint规范
                        options: {
                            enforce: "pre", //previous强制先执行 post强制后执行,默认为normal
                        },
                    },
                },
                {
                    //会在内部生成一张图片,并把图片名字返回,需要使用import将图片引入 
                    //import bgc form './bgc.png'
                    test: /\.(png|jpg|gif)$/,
                    use: 'file-loader' 
                },
                {
                    //限制图片大小小于200K时使用base64转化,否则使用file-loader产生真实图片
                    test: /\.(png|jpg|gif)$/,
                    use: {
                        loader: 'uel-loader',
                        options: {
                            limit: 200*1024,
                            output: '/img/', //将文件打包进img文件夹下
                            publicPath: 'http://loaclhost:8080' //图片的公共路径
                        }
                    }
                },
                {
                    test: /\.html$/,
                    use: 'html-withimg-loader' //解析html内的图片
                }
            ],
        },
        plugins: [
            //数组放所有webpack插件
            new HtmlWebpackPlugin({
                title: "快速开始",
                template: "index.html", //模板文件
                filename: "index.html", //打包后的文件名
                minify: {
                    //压缩html文件
                    removeAttributeQuotes: true, //移除双引号
                    collapseWhitespace: true, //单行
                },
                hash: true, //引用js时使用hash戳
            }),
            new MiniCssExtractPlugin({
                filename: "main.css",
            }),
            new CleanWebpackPlugin(), //打包前删除dist目录
            new CopyWebpackPlugin({
                from:'doc', //将doc文件夹下的东西拷贝进dist
                to: './'
            }),
            new webpack.BannerPlugin('Author by xxx') //在文件开头加上备注信息
        ],
        optimization: {
            //优化项,production模式才会启用
            minimizer: [
                new OptimizeCss(),
                new UglifyjsWebpackPlugin({
                    cache: true, //是否缓存
                    parallel: true, //是否并发打包
                    sourceMap: true, //是否映射
                }),
            ],
        },
        //增加映射文件
        // devtool: 'source-map' //源码映射,会单独生成一个.map文件,出错了会标识当前报错的行和列
        // devtool: 'eval-source-map' //不会生成单独的文件但可以显示错误的行和列
        // devtool: 'cheap-module-source-map' //不会产生列,但是是一个单独的文件
        devtool: 'cheap-module-eval-source-map', //不会生成文件,集成在打包文件中,不会产生列(不提示具体位置)
        watch: true, //文件发生变化就自动打包
        watchOptions: {
            //监控的选项
            poll: 1000, //每秒问我1000次是否要打包
            aggregateTimeout: true, //防抖
            ignored: '/node_modules' //不需要监控的文件
        },
        devServer: {
            proxy: {
                // '/api': 'http://localhost:8080' //配置了一个代理服务器,以/api开头的都去找该端口
                '/api': {
                    target: 'http://localhost:8080',
                    pathRewrite: {'^/api': ''} //将/api重写为空
                }
            }
        },
        externals: { // 在html文件通过cdn引入以下文件,打包时排除以下通过import引入的包
            'vue': 'Vue',
            'vue-router': 'VueRouter',
            'element-ui': 'ELEMENT'
          },
        resolve: {
            alias: { //设置别名
                '@': resolve('src/')
            }
        }
    };
    

    区分模式时

    • webpack.base.config.js
    将以上文件的mode去掉,devServer去掉(仅开发模式使用),optimization去掉(仅生产模式启用)
    
    • webpack.prod.config.js
    const {merge} = require('webpack-merge')
    const base = require('./webpack.base.config')
    const OptimizeCss = require("optimize-css-assets-webpack-plugin"); //压缩css
    
    module.exports = merge(base,{
        mode: 'production',
        optimization: {
            minimizer: [
                new OptimizeCss()
            ]
        }
    })
    
    • webpack.dev.config.js
    const {merge} = require('webpack-merge')
    const base = require('./webpack.base.config')
    
    module.exports = merge(base,{
        mode: 'development',
        devServer: {
            proxy: {
                // '/api': 'http://localhost:8080' //配置了一个代理服务器,以/api开头的都去找该端口
                '/api': {
                    target: 'http://localhost:8080',
                    pathRewrite: {'^/api': ''} //将/api重写为空
                }
            }
        }
    })
    

    相关文章

      网友评论

          本文标题:webpack4简易配置

          本文链接:https://www.haomeiwen.com/subject/aznjwltx.html