webpack快速上手

1.下载 node.js

2.本地安装 webpack

npm install webpack webpack-cli --save-dev

3.运行 npx webpack

4.自定义Webpack配置

在根目录下创建   webpack.config.js
// 在   webpack.config.js  先简单配置
const path = require('path')
module.exports={
    entry:'./src/index.js',  //打包入口   单个
   
    output:{
        filename:'bundle.js',         //打包生成js  单个
        path:path.resolve(__dirname,'./dist'),
    },  
 }

npm i html-webpack-plugin -D   //自动打包生成html文件、不需要自己再配置
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports={
 plugins:[
        new HtmlWebpackPlugin({
            template:'./index.html',  //打包生成的html模板
            filename:'app.html',  //打包生成的html名字
            inject:'body',    //打包生成的script标签放在html那个位置
        }),
    ],
}
1.1 每次打包自动删除上次打包的文件
npm i clean-webpack-plugin -D
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const cleanPlugin = new CleanWebpackPlugin()

module.exports={
     plugins:[      
        cleanPlugin
    ],
}
1.2 开发时出现报错信息能找到是哪行
module.exports={
     devtool:'eval-source-map'
}
1.3 实时重新加载功能
npm i webpack-dev-server
module.exports={
     devServer:{
        static:'./dist'
    },
}

1.4 资源模块
//无需下载  直接配置
module.exports={
    module:{
        rules:[
             {
                test:/\.png$/,
                type:'asset/resource', //生成单独文件并导出url  加载任何资源
                generator:{
                    filename:'images/[contenthash][ext]' //打包图片存放的路径 优先级高于 assetModuleFilename
                }
            },
            {
                test:/\.svg$/,
                type:'asset/inline',  //base64格式  不会在image中显示
            },
            {
                test:/\.txt$/,
                type:'asset/source',  //文本文件  不会在image中显示       
            },
            {
                test:/\.jpg$/,
                type:'asset',  //通用资源文件 在resource与inline之间选择
                parser:{
                    dataUrlCondition:{
                        maxSize:4*1024*1024   //大于4m用resource
                    }
                }
            },
        ]
    }
}

抽离和压缩css
 npm i mini-css-extract-plugin -D   //webpack5才能使用  打包css文件
在模块中配置以下代码
const MinicssExtractPlugin = require('mini-css-extract-plugin')
module.export={
     plugins:[
       new MinicssExtractPlugin({
            filename:'style/[contenthash].css'  //打包生成放在指定位置
        })
    ],
    module:{
         rules:[
            {test:/\.css$/,use:[MinicssExtractPlugin.loader,'css-loader']}, 
        ]
    }

}

 npm i css-minimizer-webpack-plugin -D  //将打包抽离和压缩的css进行压缩
//在模块中配置以下代码
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
module.exports={
    mode:'production',  //  production 生产  development
    
     optimization:{
            minimizer:[
                new CssMinimizerPlugin()
            ]
        }
}

// 打包项目中font字体
module.exports={
    module:{
        rules:[
             {
                test:/\.(woff|woff2|eot|ttf|otf)$/i,  //打包font字体
                type:'asset/resource'
            }
        ]
    }
}

打包项目中 csv tsv xml 文件

npm i csv-loader xml-loader -D
module.exports={
    module:{
        rules:[
             {               
                test:/\.(csv|tsv)$/,   //打包项目中 csv tsv  文件
                use:'csv-loader'
            },
            {
                test:/\.xml$/,   //打包项目中 xml 文件
                use:'xml-loader'
            }
        ]
    }
}

打包自定义json模块parser

npm i toml yaml json5 -D
const toml = require('toml')
const yaml = require('yaml')
const json5 = require('json5')
module.exports={
    module:{
        rules:[
             {
                test:/\.toml$/,   //打包项目中 xml 文件
                type:'json',
                parser:{
                    parse:toml.parse
                }
            },
            {
                test:/\.yaml$/,   //打包项目中 xml 文件
                type:'json',
                parser:{
                    parse:yaml.parse
                }
            },
            {
                test:/\.json5$/,   //打包项目中 xml 文件
                type:'json',
                parser:{
                    parse:json5.parse
                }
            },
        ]
    }
}

将es6转es5

 npm i babel-loader @babel/core @babel/preset-env @babel/plugin-transform-runtime @babel/runtime -D
babel-loader  //在webpack里应用babel解析es6的桥梁
@babel/core   //babel的核心模块
@babel/preset-env    //babel预设  一组babel插件的集合
module.exports={
    module:{
        rules:[
             {
                test:/\.js$/,  //es6转es5
                exclude:/node_modules/,  // 排除里面的js
                use:{
                    loader:'babel-loader',
                    options:{
                        plugins:['@babel/preset-env']
                    }
                }
            }, //打包处理高级js文件
        ]
    }
}

代码分离方法

1.入口起点

module.exports={
 
    entry:{
         index:'./src/index.js' ,
         other :'./src/hello.js'                      //打包入口  多个
    },
    output:{
        filename:'[name].bundle.js',     //打包生成js  多个
    },  
}

2.防止重复

module.exports={
    entry:{
        index:{
            import:'./src/index.js',
            dependOn:'shared'
        },
        other:{
            import :'./src/hello.js',
            dependOn:'shared'
        },
        shared:'loadsh'    //将含有loadsh模块打包到shared
    },
     optimization:{
         splitChunks:{
             chunks:'all'    //将公共代码抽离
        }
    }
}

完整代码

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const cleanPlugin = new CleanWebpackPlugin()
const MinicssExtractPlugin = require('mini-css-extract-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
const toml = require('toml')
const yaml = require('yaml')
const json5 = require('json5')
module.exports={
    entry:'./src/index.js',  //打包入口   单个
    // entry:{
    //      index:'./src/index.js' ,
    //      other :'./src/aaa.js'                      //d打包入口  多个
    // },
    // entry:{
    //     index:{
    //         import:'./src/index.js',
    //         dependOn:'shared'
    //     },
    //     other:{
    //         import :'./src/hello.js',
    //         dependOn:'shared'
    //     },
    //     shared:'loadsh'    //将含有loadsh模块打包到shared
    // },
    output:{
        // filename:'bundle.js',         //打包生成js  单个
        filename:'[name].bundle.js',     //打包生成js  多个
        path:path.resolve(__dirname,'./dist'),
        assetModuleFilename:'images/[contenthash][ext]' //打包图片存放的路径
    },  //打包出口
    mode:'production',  //  production 生产  development
    devtool:'eval-source-map', //开发时出现报错信息能找到是哪行
    devServer:{
        static:'./dist'
        // open:true,  //自动打开浏览器
        // host:'127.0.0.1',  //地址
        // port:80  //选择打开端口号
    },
    plugins:[
        new HtmlWebpackPlugin({
            template:'./index.html',  //打包生成的html模板
            filename:'app.html',  //打包生成的html名字
            inject:'body',    //打包生成的script标签放在html那个位置
        }),
        new MinicssExtractPlugin({
            filename:'style/[contenthash].css'  //打包生成放在指定位置
        }),
        cleanPlugin
    ],
    module:{
        rules:[
            {
                test:/\.png$/,
                type:'asset/resource', //生成单独文件并导出url  加载任何资源
                generator:{
                    filename:'images/[contenthash][ext]' //打包图片存放的路径 优先级高于 assetModuleFilename
                }
            },
            {
                test:/\.svg$/,
                type:'asset/inline',  //base64格式  不会在image中显示
               
            },
            {
                test:/\.txt$/,
                type:'asset/source',  //文本文件  不会在image中显示
               
            },
            {
                test:/\.jpg$/,
                type:'asset',  //通用资源文件 在resource与inline之间选择
                parser:{
                    dataUrlCondition:{
                        maxSize:4*1024*1024   //大于4m用resource
                    }
                }
               
            },
            {test:/\.css$/,use:[MinicssExtractPlugin.loader,'css-loader']},  //打包处理css文件  loader从后往前调用
            {test:/\.less$/,use:['style-loader','css-loader','less-loader']},  //打包处理less文件  loader从后往前调用
            {
                test:/\.(woff|woff2|eot|ttf|otf)$/i,  //打包font字体
                type:'asset/resource'
            },
            {

                test:/\.(csv|tsv)$/,   //打包项目中 csv tsv  文件
                use:'csv-loader'
            },
            {
                test:/\.xml$/,   //打包项目中 xml 文件
                use:'xml-loader'
            },
            {
                test:/\.toml$/,   //打包项目中 xml 文件
                type:'json',
                parser:{
                    parse:toml.parse
                }
            },
            {
                test:/\.yaml$/,   //打包项目中 xml 文件
                type:'json',
                parser:{
                    parse:yaml.parse
                }
            },
            {
                test:/\.json5$/,   //打包项目中 xml 文件
                type:'json',
                parser:{
                    parse:json5.parse
                }
            },
            {
                test:/\.js$/,
                exclude:/node_modules/,
                use:{
                    loader:'babel-loader',
                    options:{
                        presets:['@babel/preset-env'],
                        plugins:[
                            ['@babel/plugin-transform-runtime']
                        ]
                    }
                }
            }, //打包处理高级js文件



        ]
    },
    optimization:{
        minimizer:[
            new CssMinimizerPlugin()     //将打包抽离和压缩的css进行压缩
        ],
        splitChunks:{
            chunks:'all'    //将公共代码抽离
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容