博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]Webpack5(从入门到精通)
阅读量:2230 次
发布时间:2019-05-09

本文共 15000 字,大约阅读时间需要 50 分钟。

 

 

这里写目录标题

 

1、webpack 初体验

全局安装webpack

npm i webpack webpack-cli -g
/*    index.js:webpack 入口起点文件    1.运行指令:      开发环境:webpack ./src/index.js -o ./build/built.js --mode=development      webpack会以 ./src/index.js 为入口文件开始打包,打包后输出到 ./build/built.js      生产环境:webpack ./src/index.js -o ./build/built.js --mode=production      webpack会以 ./src/index.js 为入口文件开始打包,打包后输出到 ./build/built.js    2.结论:      1.webpack能处理js/json资源,不能处理css/img等其他资源      2.生产环境比开发环境多压缩一个js文件 */function add(x,y) {    return x+y;}add(1,2)

执行打包 这个文件,打包成功

在这里插入图片描述

总结: index.js:webpack 入口起点文件

1.运行指令:

开发环境:webpack ./src/index.js -o ./build/built.js --mode=development
webpack会以 ./src/index.js 为入口文件开始打包,打包后输出到 ./build/built.js
生产环境:webpack ./src/index.js -o ./build/built.js --mode=production
webpack会以 ./src/index.js 为入口文件开始打包,打包后输出到 ./build/built.js
2.结论:
1.webpack能处理js/json资源,不能处理css/img等其他资源
2.生产环境比开发环境多压缩一个js文件

2.打包样式资源

创建webpack.config.js文件(配置文件)

use 数组中顺序执行:从右到左,从上到下

const {resolve} = require('path');module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.less/,                //使用哪些loader进行处理                use:[                    'style-loader',                    'css-loader',                ]            },            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    'style-loader',                    'css-loader',                    'less-loader'                ]            },        ]    },    // 模式    mode:'development'}

3.打包html资源

webpack.config.js文件(配置文件)

plugin 1.下载,2.引入,3.使用

const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        })    ],    // 模式    mode:'development'}

4.打包图片资源

webpack.config.js文件(配置文件)

需要url-loader 和html-loader

const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.less/,                //使用哪些loader进行处理                use:[                    'style-loader',                    'css-loader',                ]            },            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    'style-loader',                    'css-loader',                    'less-loader'                ]            },            {                // 处理图片资源,但是处理不了html中img的路径问题                test: /\.(jpg|png|gif)$/,                loader:'url-loader',                options:{                    limit: 8* 1024,                    // 关闭es6                    esModule:false,                    name:'[hash:10].[ext]' //不重复名字                },            },            {                // 处理html中的img                test: /\.html$/,                loader:'html-loader'            }        ]    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        })    ],    // 模式    mode:'development'}

5.打包其他资源

webpack.config.js文件(配置文件)

主要用到 file-loader

const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.less/,                //使用哪些loader进行处理                use:[                    'style-loader',                    'css-loader',                ]            },            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    'style-loader',                    'css-loader',                    'less-loader'                ]            },            {                // 处理图片资源,但是处理不了html中img的路径问题                test: /\.(jpg|png|gif)$/,                loader:'url-loader',                options:{                    limit: 8* 1024,                    // 关闭es6                    esModule:false,                    name:'[hash:10].[ext]' //不重复名字                },            },            {                // 处理html中的img                test: /\.html$/,                loader:'html-loader'            },            {                // 打包其他资源                exclude: /\.(css|js|html)$/,                loader: 'file-loader'            }        ]    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        })    ],    // 模式    mode:'development'}

6.devServer

// 自动打包运行// 指令:npx webpack-dev-server

webpack.config.js文件(配置文件)

const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    'style-loader',                    'css-loader',                    'less-loader'                ]            },            {                // 处理html中的img                test: /\.html$/,                loader:'html-loader'            }        ]    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        })    ],    // 自动打包运行    // 指令:npx webpack-dev-server    devServer: {        contentBase: resolve(__dirname,'build'),        compress:true,        port:3000,        open:true    },    // 模式    mode:'development'}

7.提取css成单独文件

用到mini-css-extract-plugin插件

并且将style-loader 改为 MiniCssExtractPlugin.loader,

webpack.config.js文件(配置文件)

const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    MiniCssExtractPlugin.loader,                    'css-loader',                ]            },            {                // 处理html中的img                test: /\.html$/,                loader:'html-loader'            }        ]    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        }),        new MiniCssExtractPlugin()    ],    // 自动打包运行    // 指令:npx webpack-dev-server    devServer: {        contentBase: resolve(__dirname,'build'),        compress:true,        port:3000,        open:true    },    // 模式    mode:'development'}

8.css兼容

package.json增加

在这里插入图片描述

webpack.config.js文件(配置文件)

const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')// 设置nodejs环境变量// process.env.NODE_ENV = "development"module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    MiniCssExtractPlugin.loader,                    'css-loader',                    {                        loader: "postcss-loader",                        options:{                            ident:'postcss',                            plugins:()=>{                                require('postcss-preset-env')()                            }                        }                    }                ]            },            {                // 处理html中的img                test: /\.html$/,                loader:'html-loader'            }        ]    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        }),        new MiniCssExtractPlugin()    ],    // 自动打包运行    // 指令:npx webpack-dev-server    devServer: {        contentBase: resolve(__dirname,'build'),        compress:true,        port:3000,        open:true    },    // 模式    mode:'development'}

9.css压缩

const MiniCssExtractPlugin = require(‘mini-css-extract-plugin’)

const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')// 设置nodejs环境变量// process.env.NODE_ENV = "development"module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    MiniCssExtractPlugin.loader,                    'css-loader',                    {                        loader: "postcss-loader",                        options:{                            ident:'postcss',                            plugins:()=>{                                require('postcss-preset-env')()                            }                        }                    }                ]            },            {                // 处理html中的img                test: /\.html$/,                loader:'html-loader'            }        ]    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        }),        new MiniCssExtractPlugin(),        new OptimizeCssAssetsWebpackPlugin()    ],    // 自动打包运行    // 指令:npx webpack-dev-server    devServer: {        contentBase: resolve(__dirname,'build'),        compress:true,        port:3000,        open:true    },    // 模式    mode:'development'}

10.eslint 语法检查

注意:不检查第三方 node_module

npm i eslint eslint-loader eslint-config-airbnb-base eslint-plugin-import

"eslintConfig": {    "extends": "airbnb-base"  }
const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')// 设置nodejs环境变量// process.env.NODE_ENV = "development"module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    MiniCssExtractPlugin.loader,                    'css-loader',                    {                        loader: "postcss-loader",                        options:{                            ident:'postcss',                            plugins:()=>{                                require('postcss-preset-env')()                            }                        }                    }                ]            },            {                // 处理html中的img                test: /\.html$/,                loader:'html-loader'            },            // {            //     test:/\.js$/,            //     exclude:/node_modules/,            //     loader:'eslint-loader',            //     options:{            //         fix:true            //     }            // }        ]    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        }),        new MiniCssExtractPlugin(),        new OptimizeCssAssetsWebpackPlugin()    ],    // 自动打包运行    // 指令:npx webpack-dev-server    devServer: {        contentBase: resolve(__dirname,'build'),        compress:true,        port:3000,        open:true    },    // 模式    mode:'development'}

11.js,html压缩只要将mode改为production就会自动压缩

12.开发性能提升:HMR:热模块替换

在devServer中启动hot:true,

css默认启动hmr因为style-loader内部启动了
js:需要在js中添加

if (module.hot){    module.hot.accept('./print.js',function () {        print();    })}

13.开发性能提升:source-map

方便找出开发中的错误

devtool: "source-map",
const {resolve} = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')// 设置nodejs环境变量// process.env.NODE_ENV = "development"module.exports = {    // 入口    entry:'./src/index.js',    // 输出    output:{        // 输出文件名        filename:'built.js',        //输出路径        path:resolve(__dirname,'build')    },    // loader的配置    module:{        rules:[            {                //匹配哪些文件                test:/\.css/,                //使用哪些loader进行处理                use:[                    MiniCssExtractPlugin.loader,                    'css-loader',                    {                        loader: "postcss-loader",                        options:{                            ident:'postcss',                            plugins:()=>{                                require('postcss-preset-env')()                            }                        }                    }                ]            },            {                // 处理html中的img                test: /\.html$/,                loader:'html-loader'            }        ]    },    plugins:[        new HtmlWebpackPlugin({            // 复制一个html文件,并引入            template:'./src/index.html'        }),        new MiniCssExtractPlugin(),        new OptimizeCssAssetsWebpackPlugin()    ],    // 自动打包运行    // 指令:npx webpack-dev-server    devServer: {        contentBase: resolve(__dirname,'build'),        compress:true,        port:3000,        open:true    },    devtool: "source-map",    // 模式    mode:'development'}

13.生产性能提升:tree-shaking(去除没用到的代码)

1.必须es6模块化,2.开启生产环境

在package.json中配置

"sideEffects":["*.css"]

---------------------
作者:培歌行
来源:CSDN
原文:https://blog.csdn.net/weixin_43964148/article/details/105313149
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:

你可能感兴趣的文章
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第六章 应用编排与管理:Deployment
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>
阿里云《云原生》公开课笔记 第九章 应用存储和持久化数据卷:核心知识
查看>>
linux系统 阿里云源
查看>>
国内外helm源记录
查看>>
牛客网题目1:最大数
查看>>
散落人间知识点记录one
查看>>
Leetcode C++ 随手刷 547.朋友圈
查看>>
手抄笔记:深入理解linux内核-1
查看>>
内存堆与栈
查看>>
Leetcode C++《每日一题》20200621 124.二叉树的最大路径和
查看>>
Leetcode C++《每日一题》20200622 面试题 16.18. 模式匹配
查看>>