1.需要的插件
    npm i webpack webpack-cli vue-loader vue-template-compiler sass-loader sass css-loader style-loader babel-loader @babel/core @babel/preset-env @babel/runtime @babel/plugin-transform-runtime

    安装loader,主要作用就是编译和转换。

    webpack.config.js 是在node.js环境下运行的,配置文件用的是commonjs的语法。

    webpack-cli 提供webpack的终端命令,去调用webpack

    sass-loader css-loader style-loader:
    比如把sass代码转换成css代码,style-loader将css引入到style标签。

    babel-loader @babel/core(核心库) @babel/preset-env(预设的配置集合),
    babel在转译的时候,会将源码分成syntax 和 api 两部分处理,处理api需要用到一些辅助函数, @babel/runtime包含两个文件夹:helpers(定义了一些处理新的语法关键字的帮助函数)、regenerator ( 仅仅是引用regenerator-runtime这个npm包)。
    @babel/plugin-transform-runtime : 当需要用到regeneratorRuntime的地方,会自动引入

    把新的es6语法转换成旧的语法,让浏览器兼容。

    vue-loader vue-template-compiler:
    vue-loader是用来解析和转换.vue文件的,vue-loader会将vue组件里的js脚本(script),样式代码style 和template 模板提取出来,交给对应的loader去处理,比如js脚本会交给babel-loader,样式会交给css-loader,template模板会交给vue-template-compiler 处理,将html模板编译成可以执行的js代码。

    图片,字体,图标等资源:
    webpack4是用raw-loader,url-loader和file-loader,webpack5是通过资源模块类型代替了以前的loader,
    asset/resource导出url形式,
    asset/inline导出URI形式,base64,
    asset/source 导出资源的源代码
    asset是在 URL 和 URI 之间选择

                    {
                        test: /\.jpg$/,
                        type: "asset",
                        parser: {
                            dataUrlCondition: {
                                // 少于4mb生成base64,选择inline类型
                                maxSize: 4 * 1024 * 1024
                            }
                        }
                    },
    

    2.完整webpack.config.js配置
    webpack.config.js

    const path = require('path')
    const {VueLoaderPlugin} = require('vue-loader')
    
    module.exports = {
        // entry 入口是指定从哪个文件开始分析
        entry: './src/main.js',
    
        // output就是定义打包后的文件输出到哪个文件夹,以及定义文件的命名
        output: {
            // path必须是绝对路径 , __dirname是当前项目的绝对路径
            // 因为window和linux系统的路径符号不一样,需要用到path.resolve函数,会根据操作系统,拼接出绝对路径
            path: path.resolve(__dirname, 'dist'),
            filename: "bundle.js"
        },
    
        // 模块,在webpack里,所有的文件都是模块,比如说js,css,vue组件,图片都被webpack视为一个模块
        // 然后用loader,对这些模块进行编译,转换
        module: {
            // rules,对象数组,模块的打包规则
            rules: [
                { test: /\.vue$/, use: 'vue-loader' },
                { test: /\.s[ca]ss$/, use: ['style-loader', 'css-loader', 'scss-loader'] }, // scss或sass
    
                // mjs或js
                {
                    test: /\.m?js$/,
                    exclude: /node_modules/,
                    use:{
                        loader: "babel-loader",
                        options: {
                            // 预设配置
                            presets:['@babel/preset-env'],
                            plugins: [
                                // 当需要用到regeneratorRuntime的地方,会自动引入
                                [
                                    '@babel/plugin-transform-runtime'
                                ]
                            ]
                        }
                    }
                },
    
                // 图片处理 ,旧语法,raw-loader,url-loader,file-loader
                // { test: /\.(png|jpe?g|gif|svg|webp)$/, use: { loader: "file-loader", options: {esModule:false}}}
    
                // 新语法 , 资源模块类型
                { test: /\.(png|jpe?g|gif|svg|webp)$/, type: "asset/resource"},
    
    
            ]
        },
    
        // plugins插件,是用来增强webpack的功能的,数组里面存放的是构造函数的实例
        plugins: [
            new VueLoaderPlugin(),
        ],
    
        devtool: 'source-map'
    }
    

    main.js

    // 入口文件
    
    // 创建一个vue的实例,绑定到id为app的元素上(创建真实dom,将app元素替换掉)
    import { createApp } from 'vue'
    import App from "./App.vue";
    
    // 注册 vue-router
    import router from "./router/index.js";
    
    const app = createApp(App)
    app.use(router).mount('#app')