webpack基础应用

本文介绍了webpack的基础应用,包括开发和生产模式的配置。在开发模式下,webpack仅编译es module语法,并具备文件改动自动重载功能。生产模式则在编译的基础上还会压缩js代码。核心概念包括entry(入口)、output(输出)、loader(加载器)、plugins(插件)和mode(模式)。生产模式中,还需进行代码优化,如提取css为单独文件并处理兼容问题。
摘要由CSDN通过智能技术生成

开发模式:仅能编译js的es module语法
生产模式:能编译js的es module语法,还能压缩js代码
5大核心概念
1.entry(入口)
指示webpack从那个文件开始打包
2.output (输出)
指示webpack打包完的文件输出到哪里去,如何命名等
3.loader(加载器)
webpack本身只能处理js /json 等资源,其他资源需要借助loader,webpack才能解析
4.plugins(插件)
扩展webpack的功能
5.mode(模式)
开发模式:development
生产模式:production

开发模式配置

不需要输出dist文件夹,有文件改动时,开发服务器监听到自动运行

const path = require("path");//nodejs核心模块,专门用来处理路径问题
const ESLintPlugin = require('eslint-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    //入口
    entry: "./src/main.js",// 相对路径
    //输出
    output: {
        //文件的输出路径
        //__dirname nodejs的变量,代表当前文件的文件夹目录
        //开发模式没有输出
        // path: path.resolve(__dirname, "dist"),//绝对路径
        path:undefined,
        //文件名
        filename: "static/js/main.js",
        //自动清空上次打包内容
        //原理,在打包前,将path整个目录内容清空,再进行打包
        clean: true,
    },
    //加载器
    module: {
        rules: [
            //loader的配置
            {
                test: /\.css$/,//只会检测.css文件
                use: [
                    //执行顺序,从右到左(从下到上)
                    "style-loader",//将js中css通过创建style标签添加到html文件中生效
                    "css-loader"//将css资源编译成commonjs的模块到js中
                ]
            },
            {
                test: /\.less$/i,
                use: [
                    // compiles Less to CSS
                    'style-loader',
                    'css-loader',
                    'less-loader',//将less编译成css文件
                ],
            },
            {
                test: /\.s[ac]ss$/i,
                use: [
                    // 将 JS 字符串生成为 style 节点
                    'style-loader',
                    // 将 CSS 转化成 CommonJS 模块
                    'css-loader',
                    // 将 Sass 编译成 CSS
                    'sass-loader',
                ],
            },
            {
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                        //小于10kb的图片转base64
                        //优点:减少请求次数,缺点文件大一点
                        maxSize: 10 * 1024,
                    }
                },
                generator: {
                    //输出图片名称hash文件的hash名,ext文件扩展名query图片请求路径携带的参数
                    //hash:10只取前10位
                    filename: 'static/images/[hash:10][ext][query]'
                }
            },
            {
                test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
                type: "asset/resource",
                generator: {
                    //输出图片名称hash文件的hash名,ext文件扩展名query图片请求路径携带的参数
                    //hash:10只取前10位
                    filename: 'static/media/[hash:10][ext][query]'
                }
            },
            {
                test: /\.m?js$/,
                exclude: /(node_modules|bower_components)/,//排除node_module中的js文件不处理
                loader: 'babel-loader',
                // options: {
                //     presets: ['@babel/preset-env']
                // } //在babel.config.js维护
            }
        ]
    },
    //插件
    plugins: [
        //plugin的配置
        new ESLintPlugin({
            //检测哪些文件
            context: path.resolve(__dirname, '../src')
        }),
        new HtmlWebpackPlugin({
            //模板,以public/index.htm文件创建新的html文件;
            //新的html文件特点:1.结构和原来一致2.自动引入打包输出的资源
            template: path.resolve(__dirname, '../public/index.html')
        })
    ],
    //开发服务器:不会输出资源,在内存中编译打包的
    devServer: {
        host: "localhost",//启动服务器域名
        port: "3000",//启动服务器端口号
        open: true,//是否自动打开浏览器
    },
    //模式
    mode: "development"
}

Eslint配置.eslintrc.js

module.exports={
    //继承Eslint规则
    extends:["eslint:recommended"],
    env:{
        node:true,//启用node中全局变量
        browser:true,//启用浏览器中全局变量
    },
    parserOptions:{
        ecmaVersion:6,//es 6
        sourceType:"module",//es module
    },
    rules:{
        "no-var":2,//不能使用var定义变量
    }
}

.eslintignore需要忽略处理的文件

dist

生产模式准备

开发完,需要部署上线,对代码进行优化,让其运行性能更好
在这里插入图片描述
package.json配置不同模式运行指令
在这里插入图片描述
不要开发服务器

const path = require("path");//nodejs核心模块,专门用来处理路径问题
const ESLintPlugin = require('eslint-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");//css兼容处理插件
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");//css压缩插件
//用来获取处理样式的loader方法
function getStyleLOader(pre){
    return  [
        //执行顺序,从右到左(从下到上)
        MiniCssExtractPlugin.loader,//提取css成单独文件
        "css-loader",//将css资源编译成commonjs的模块到js中
        {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: [
                  [
                    'postcss-preset-env',
                    {
                      // 其他选项
                    },
                  ],
                ],
              },
            },
          },
          pre
    ].filter(Boolean)
}
module.exports = {
    //入口
    entry: "./src/main.js",// 相对路径
    //输出
    output: {
        //文件的输出路径
        //__dirname nodejs的变量,代表当前文件的文件夹目录
        //开发模式没有输出
        path: path.resolve(__dirname, "../dist"),//绝对路径
        //文件名
        filename: "static/js/main.js",
        //自动清空上次打包内容
        //原理,在打包前,将path整个目录内容清空,再进行打包
        clean: true,
    },
    //加载器
    module: {
        rules: [
            //loader的配置
            {
                test: /\.css$/,//只会检测.css文件
                use:getStyleLOader()
            },
            {
                test: /\.less$/i,
                use:getStyleLOader('less-loader')
            },
            {
                test: /\.s[ac]ss$/i,
                use:getStyleLOader('sass-loader') 
            },
            {
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                        //小于10kb的图片转base64
                        //优点:减少请求次数,缺点文件大一点
                        maxSize: 10 * 1024,
                    }
                },
                generator: {
                    //输出图片名称hash文件的hash名,ext文件扩展名query图片请求路径携带的参数
                    //hash:10只取前10位
                    filename: 'static/images/[hash:10][ext][query]'
                }
            },
            {
                test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
                type: "asset/resource",
                generator: {
                    //输出图片名称hash文件的hash名,ext文件扩展名query图片请求路径携带的参数
                    //hash:10只取前10位
                    filename: 'static/media/[hash:10][ext][query]'
                }
            },
            {
                test: /\.m?js$/,
                exclude: /(node_modules|bower_components)/,//排除node_module中的js文件不处理
                loader: 'babel-loader',
                // options: {
                //     presets: ['@babel/preset-env']
                // } //在babel.config.js维护
            }
        ]
    },
    //插件
    plugins: [
        //plugin的配置
        new ESLintPlugin({
            //检测哪些文件
            context: path.resolve(__dirname, '../src')
        }),
        new HtmlWebpackPlugin({
            //模板,以public/index.htm文件创建新的html文件;
            //新的html文件特点:1.结构和原来一致2.自动引入打包输出的资源
            template: path.resolve(__dirname, '../public/index.html')
        }),
        new MiniCssExtractPlugin({
            filename:"static/css/main.css"//打包到指定的文件夹
        }),
        new CssMinimizerPlugin(),
    ],
    //模式
    mode: "production"
}

目前是先编译html文件再css编译成style插入到html文件里
css处理,提取css单独文件,通过link标签引入
处理css兼容问题
npm i postcss-loader postcss postcss-preset-env -D

{
                test: /\.css$/,//只会检测.css文件
                use: [
                    //执行顺序,从右到左(从下到上)
                    MiniCssExtractPlugin.loader,//提取css成单独文件
                    "css-loader",//将css资源编译成commonjs的模块到js中
                    {
                        loader: 'postcss-loader',
                        options: {
                          postcssOptions: {
                            plugins: [
                              [
                                'postcss-preset-env',
                                {
                                  // 其他选项
                                },
                              ],
                            ],
                          },
                        },
                      },
                ]
            },
package.json配置需要兼容的程度
  "browserslist":[
    "last 2 version",//所有浏览器最近的两个版本
    "> 1%",//覆盖99%的浏览器
    "not dead"//不要弃用了
  ]

压缩css

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值