webpack基础配置及使用

news2024/11/24 7:51:48

webpack是什么

  • 是一个现代 JavaScript 应用程序的静态模块打包器。当webpack 处理应用程序时,它会递归地构建一个依赖关系图 ,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle
  • 主要有 五个核心概念:
    • 入口entry:指示 webpack 从哪个文件开始打包。
    • 输出output:会告诉 webpack 打包完的文件输出到哪里去,以及如何命名这些文件,默认值为 ./dist:
    • 加载器loaderwebpack 只能处理 JavaScript、json等资源,其他资源需要借助loader 才能解析。
    • 插件plugins: 扩展webpack 的功能。使用一个插件也非常容易,只需要 require() ,然后添加到 plugins 数组中。
    • 模式mode:主要是两种模式
      • 开发模式:development
      • 生产模式:production

配置

  • 初始化包:npm init -y

    • 包名不能是webpack
  • 下载依赖:npm i webpack webpack-cli -D

    • npm代理设置

      # 设置http代理
      npm config set proxy http://ip:port
      npm config set https_proxy http://ip:port
      
    • npm代理设置为空

      npm config set proxy null
      npm config set https-proxy null
      
    • 更换淘宝镜像:npm config set registry https://registry.npmmirror.com

  • 从入口打包:npx webpack 入口js文件 --mode=development

    • 打包好后在dist里面

配置文件

const path = require("path"); //nodejs核心模块,专门用来处理路径问题

module.exports = {
    //入口
    entry: "./src/main.js", //相对路径
    //输出
    output:{
        //文件的输出路径
        //__dirname nodejs的变量,代表当前文件的文件夹目录
        path: path.resolve(__dirname, "dist"), //绝对路径
        filename:"main.js",
    },
    //加载器
    module: {
        rules: [
            //loader的配置
        ],
    },
    //插件
    plugins: [
        //plugin的配置
    ],
    //模式
    mode: "development",
};

处理样式资源

1.处理什么资源就要先引入什么资源

2.根据官方文档去下载对应的loadernpm install --save-dev css-loader

3.把loader引用到配置中

//加载器
    module: {
        rules: [
            //loader的配置
            {
                test:/\.css$/, //只检测.css文件
                use: [ //执行顺序,从右到左(从下到上
                    "style-loader", //将js中css通过创建style标签添加html文件中生效
                    "css-loader", //将css资源编译成common.js的模块到js中
                ],
            },
        ],
    },

4.用几个包就要下载几个包,运行通过报错知道style-loader没有下载,则npm i style-loader -D

处理Less资源

步骤类似

  • 下载对应的loadernpm install less less-loader --save-dev

  • 引入loader

    {
                    test: /\.less$/i,
                    //loader: 'xxx' //只能使用一个loader
                    use: [
                      // 使用多个loader
                      'style-loader',
                      'css-loader',
                      'less-loader', //将less编译成css文件
                    ],
                },
    

处理sass资源

  • 下载loadernpm install sass-loader sass webpack --save-dev

  • 引入loader

    {
                    test: /\.s[ac]ss$/i,
                    use: [
                      // 将 JS 字符串生成为 style 节点
                      'style-loader',
                      // 将 CSS 转化成 CommonJS 模块
                      'css-loader',
                      // 将 Sass 编译成 CSS
                      'sass-loader',
                    ],
                },
    

处理stylus资源

  • 下载loadernpm install stylus stylus-loader --save-dev

  • 引入loader

    {
                    test: /\.styl$/,
                    use: [
                        'style-loader',
                        'css-loader',
                        'stylus-loader', //将stylus编译成css文件
                    ],
                },
    

处理图片资源

处理图片资源webpack已经内置这个功能了,但想要让图片转base64进行优化,可以加入下面的loader配置

{
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: 'asset',
                parser: {
                 dataUrlCondition: {
                    //小于10kb的图片转base64
                    //优点:减少请求数量 缺点:体积会更大
                   maxSize: 10 * 1024 // 10kb
                 },
               },
            },

修改输出文件目录

希望不同的资源去不同的路径下寻找,这样更简洁明了。对应的路径可以在output下修改:

//输出
    output:{
        //所有文件的输出路径
        //__dirname nodejs的变量,代表当前文件的文件夹目录
        path: path.resolve(__dirname, "dist"), //绝对路径
        //入口文件打包输出文件名
        filename:"static/js/main.js",
    },

而图片可以添加generator修改路径:

{
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: 'asset',
                parser: {
                 dataUrlCondition: {
                    //小于10kb的图片转base64
                    //优点:减少请求数量 缺点:体积会更大
                   maxSize: 10 * 1024 // 10kb
                 },
               },
               generator: {
                //输出图片名称
                //hash:10 hash值只取前10位
                filename: 'static/images/[hash:10][ext][query]',
              },
            },

自动清空上次打包的内容

output里面添加clean: true即可,原理是:在打包前,将path整个目录的内容清空,再进行打包

处理字体图标资源

处理场景有很多,这个以阿里巴巴的图标库为例。

  • 1.下载阿里巴巴素材库中的图标,以供使用。

  • 2.下载好安装包,打开demo_index.html来进行操作,以其中font-class为例。
    在这里插入图片描述

  • 3.引入iconfont.css,并根据自己引入的位置将最上方的url设置正确

    • main.js也要importcss
  • 4.引入iconfont.ttficonfont.wofficonfont.woff2

  • 5.挑选相应图标并获取类名,应用于页面:<span class="iconfont icon-xxx"></span>

处理其他资源

有视频等其他资源就在test里面添加就可以了

{
                test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
                type: 'asset/resource', //这个就不要转换成base64
                generator: {
                    //输出图片名称
                    filename: 'static/media/[hash:10][ext][query]',
                },
            },

处理js资源

  • webpack对js处理是有限的,只能编译js中ES模块化语法,不能编译其他语法,导致js不能在IE等浏览器上运行,所以希望能做一些兼容性处理。
    • 针对js兼容性处理,使用Babel来完成。
    • 针对代码格式,使用Eslint来完成。

Eslint使用

  • 检测代码的错误

  • 1.安装插件:npm install eslint-webpack-plugin --save-devnpm install eslint --save-dev

  • 2.插件与loader不一样,需要引入后才能用:const ESLintPlugin = require('eslint-webpack-plugin');

  • 3.添加plugins配置,选择检测哪些文件

    plugins: [
            //plugin的配置
            new ESLintPlugin({
                //检测哪些文件
                context: path.resolve(__dirname, "src"),
            }),
        ],
    
  • 4.配置文件.eslintrc.js(只是一些常规的

    module.exports = {
        // 继承 Eslint 规则
        extends: ["eslint:recommended"],
        env: {
          node: true, // 启用node中全局变量
          browser: true, // 启用浏览器中全局变量
        },
        parserOptions: {
          ecmaVersion: 6, // es6
          sourceType: "module", // es module
        },
        rules: {
          "no-var": 2, // 不能使用 var 定义变量
        },
      };
      
    
  • 5.若想忽略一些文件夹的检测,就创建.eslintignore,在里面写文件名即可

Babel

  • 将一些新的语法转换成旧的,以起到兼容的作用

  • 1.下载包:npm install -D babel-loader @babel/core @babel/preset-env

  • 2.导入loader

    {
                    test: /\.js$/,
                    exclude: /(node_modules)/, //排除node_modules中的js文件(这些文件不处理
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env'],
                    },
                },
    

处理Html资源

  • 不需要手动引入js,通过插件自动引入

  • 1.安装包:npm install --save-dev html-webpack-plugin

  • 2.在webpack.config.js引入const HtmlWebpackPlugin = require('html-webpack-plugin');

  • 3.在plugins里添加

    new HtmlWebpackPlugin({
                //模板,以public/index.html文件创建新的html文件
                //新的文件特点:1、结构和原来一致 2、自动引入打包输出的资源
                template: path.resolve(__dirname, "public/index.html"),
            }),
    

开发服务器&自动化

  • 1.下载包:npm i webpack-dev-server -D

  • 2.在webpack.config.js引入

    //开发服务器
        devServer:{
            host: "localhost", //启动服务器域名
            port: "3000", //启动服务器端口号
            open: true, //是否自动打开浏览器
        },
    
  • 3.启动指令是:npx webpack serve

  • PS:开发服务器不会输出资源,在内存中编译打包的

生产模式准备工作

  • 生产模式是开发完成代码后,需要将代码部署上线。这个模式主要是对代码进行优化,从以下两个角度:
    • 代码运行性能
    • 代码打包速度
  • dev是开发者模式,没有输出。
    • 开发模式配置了devServer之后是不输出资源的,在内存中编译打包。
    • 命令:webpack serve --config ./config/webpack.dev.js(根据自己的路径找js
  • prod是生产模式,有输出。
    • 生产模式不需要devServer,它只需要打包输出即可。
    • 命令:webpack --config ./config/webpack.prod.js

提取css成单独文件

  • css文件目前被打包到js文件中,当js文件加载时,会创建一个style标签来生成样式,这样对于网站而言,会出现闪屏现象,用户体验不好。我们应该是单独的css文件,通过link标签加载,这样性能才会好。

  • 1.下载包:npm install --save-dev mini-css-extract-plugin

  • 2.在webpack.prod.js上方引入插件:const MiniCssExtractPlugin = require("mini-css-extract-plugin");

  • 3.把文件中'style-loader',都换成MiniCssExtractPlugin.loader,

  • 4.plugins里面添加new MiniCssExtractPlugin(),

    • 可以通过filename来设置生成的css所在的路径

      new MiniCssExtractPlugin({
                  filename: "static/css/main.css",
              }),
      

样式兼容性处理

  • 1.下载包:npm i postcss-loader postcss postcss-preset-env -D

  • 2.在css-loader都加上:

    {
                            loader: "postcss-loader",
                            options: {
                                postcssOptions: {
                                    plugins: [
                                        "postcss-preset-env", //能解决大部分样式兼容性问题
                                    ],
                                },
                            },
                        },
    
  • 3.可以在package.json里添加要控制什么兼容条件

    "browserslist": [
        "last 2 version",
        "> 1%",
        "not dead"
      ]
    

封装样式loader函数

相同的代码可以封装成函数,简化代码。

//用来获取处理样式的loader
function getStyleLoader(pre){
    return [
        MiniCssExtractPlugin.loader, //提取css成单独文件
        "css-loader", //将css资源编译成common.js的模块到js中
        {
            loader: "postcss-loader",
            options: {
                   postcssOptions: {
                        plugins: [
                            "postcss-preset-env", //能解决大部分样式兼容性问题
                    ],
                },
            },
        },
        pre,
    ].filter(Boolean);
}

css压缩

  • css-minimizer-webpack-plugin使用 cssnano优化和压缩css,就像 optimize-css-assets-webpack-plugin一样,但在 source mapsassets中使用查询字符串会更加准确,支持缓存和并发模式下运行。
  • 1.下载包:npm install css-minimizer-webpack-plugin --save-dev
  • 2.在webpack.prod.js上方引入插件:const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
  • 3.plugins里面添加new CssMinimizerPlugin(),

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1489240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据服务安全的重要性

数据服务安全在当今信息化社会显得尤为重要。随着大数据、云计算、人工智能等技术的飞速发展&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;数据服务安全也面临着前所未有的挑战。本文将从数据服务安全的重要性、常见威胁、防护策略以及未来发展趋势等方面进行探讨…

【学位论文】上海交通大学 研究生学位论文 本地保存

上海交大研究生学位论文网&#xff1a;http://thesis.lib.sjtu.edu.cn/ &#xff08;只能校内访问或SJTU VPN访问&#xff09; 如果希望下载论文&#xff0c;需要参考&#xff1a;https://github.com/olixu/SJTU_Thesis_Crawler 安装过程 安装过程的几个坑&#xff1a; &a…

day04-Maven-SpringBootWeb入门

文章目录 01. Maven1.1 课程安排1.2 什么是Maven1.3 Maven的作用1.4 Maven模型1.5 Maven仓库1.6 Maven安装1.6.1 下载1.6.2 安装步骤 2 IDEA集成Maven2.1 配置Maven环境2.1.1 当前工程设置2.1.2 全局设置 2.2 创建Maven项目2.3 POM配置详解2.4 Maven坐标详解2.5 导入Maven项目 …

带使能控制的锂电池充放电解决方案

一、产品概述 TP4594R 是一款集成线性充电管理、同步升压转换、电池电量指示和多种保护功能的单芯片电源管理 SOC&#xff0c;为锂电池的充放电提供完整的单芯片电源解决方案。 TP4594R 内部集成了线性充电管理模块、同步升压放电管理模块、电量检测与 LED 指示模块、保护模块…

失败与坚持

失败 很多计划和目标由于个人能力等问题&#xff0c;都失败了。 如果将最近十年规划的目标算一个总评的话&#xff0c;接近97%的目标都没有实现。 这主要原因就是脱离了自身实际制定了一些超出自身能力所及的目标&#xff0c;当然也有一些客观因素。 坚持 有擅长做的事情&am…

Redis集群(主从)

1.主从集群 集群结构: 一.单机安装redis 1.上传压缩包并解压&#xff0c;编译 tar -xzf redis-6.2.4.tar.gz cd redis-6.2.4 make && make install 2.修改redis.config的配置并启动redis # 绑定地址&#xff0c;默认是127.0.0.1&#xff0c;会导致只能在本地访问。…

技术面没过,居然是因为没用过Pytest框架

01 概述 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 简单灵活&#xff0c;容易上手&#xff0c;文档丰富&#xff1b; 支持参数化&#xff0c;可以细粒度地控制要测试的测试用例&#xff1b; 能够支持简单的单元测试和复杂的…

什么是网络安全、信息安全、计算机安全,有何区别?

这三个概念都存在&#xff0c;一般人可能会混为一谈。 究竟它们之间是什么关系&#xff1f;并列&#xff1f;交叉&#xff1f; 可能从广义上来说它们都可以用来表示安全security这样一个笼统的概念。 但如果从狭义上理解&#xff0c;它们应该是有区别的&#xff0c;区别在哪呢&…

HFSS仿真双频微带天线学习笔记

HFSS仿真双频微带天线 文章目录 HFSS仿真双频微带天线1、 求解器设置2、 建模3、 激励方式设置4、 边界条件设置5、 扫频设置6、 设计检查&#xff0c;仿真分析7、 数据后处理 这里重点关注HFSS软件的操作&#xff0c;关于理论知识将在后面的文章中进行更新。 设计要求&#xf…

Golang pprof 分析程序的使用内存和执行时间

一、分析程序执行的内存情况 package mainimport ("os""runtime/pprof" )func main() {// ... 你的程序逻辑 ...// 将 HeapProfile 写入文件f, err : os.Create("heap.prof")if err ! nil {panic(err)}defer f.Close()pprof.WriteHeapProfile(f…

React 模态框的设计(四)状态管理

最近忙的不可开交&#xff0c;每天恨不得把时间掰开使用&#xff0c;挣不到钱还没时间&#xff0c;有时候我在想我怎么混得这个样子。题外话不多说&#xff0c;从这节课开始&#xff0c;我把这个模态框的教程写完整。请看效果&#xff1a; 这个模态框功能相对比较完整&#x…

桂院校园导航 静态项目 二次开发教程 2.0

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 静态项目 2.0版本 升级日志 序号 板块 详情 1 首页 重做了首页&#xff0c;界面更加高效和美观 2 校园页 新增了 “校园指南” 功能&#xff0c;可以搜索和浏览校园生活指南…

聊聊国内「类Sora模型」发展现状,和 Sora 的差距到底有多大?

2024 年 2 月 16 日。 就在谷歌发布他新一代的多模态大模型 Gemini 1.5 Pro 的同一天&#xff0c;OpenAI 带着新一代的文生视频模型 Sora 再次抓住了全世界人们的眼球。 “颠覆”、“炸裂”、“变天”、“疯狂”&#xff0c;类似的形容词一夜之间簇拥在 Sora 周围&#xff0c;…

浅谈一个CTF中xss小案例

一、案例代码 二、解释 X-XSS-Protection: 0&#xff1a;关闭XSS防护 之后get传参&#xff0c;替换过滤为空&#xff0c;通过过滤保护输出到img src里面 三、正常去做无法通过 因为这道题出的不严谨所以反引号也是可以绕过的 正常考察我们的点不在这里&#xff0c;正常考察…

LSA头部结构简述

LSA&#xff08;Link State Advertisement&#xff09;是一种用于路由协议头部结构&#xff0c;用于在网络中传递路由信息。 LSA头部结构包含以下几个字段&#xff1a; 1、LSA类型&#xff08;LSA Type&#xff09;&#xff1a;指示LSA的类型&#xff0c;不同类型的LSA用于传递…

怎么压缩成mp4视频?

在数字化时代&#xff0c;视频已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到视频文件太大的问题&#xff0c;不便于传输、存储或分享。那么&#xff0c;如何将视频压缩成MP4格式&#xff0c;以减小文件大小呢&#xff1f;本文将为您介绍几种简…

某大型制造企业数字化转型规划方案(附下载)

目录 一、项目背景和目标 二、业务现状 1. 总体应用现状 2. 各模块业务问题 2.1 设计 2.2 仿真 2.3 制造 2.4 服务 2.5 管理 三、业务需求及预期效果 1. 总体业务需求 2. 各模块业务需求 2.1 设计 2.2 仿真 2.3 制造 2.4 服务 2.5 管理 四、…

四年一段旅途,一个起点,一个机会

不得不感慨一下&#xff0c;现在的年轻人、大学生实在是太厉害了 最近加入了一个社群&#xff0c;是一名大三学生创建的&#xff0c;他短短一年间&#xff0c;就创建了一个数千人的社群&#xff0c;还运营的几十个副业社群&#xff0c;一年的时间变现100W&#xff0c;这些成绩…

嵌入式学习第二十四天!(进程间通信:消息队列、共享内存、信号灯)

进程间的通信&#xff1a; 消息队列、共享内存、信号灯&#xff1a; 1. IPC对象&#xff1a;内存文件 1. ipcs&#xff1a; 查看系统中的消息队列&#xff0c;共享内存、信号灯的信息 2. ipcrm&#xff1a; 删除消息队列、共享内存、信号灯 ipcrm -Q/-M/-S key ipcrm -q/-m/-s…

Jmeter系列(4) 线程属性详解

线程属性 线程组是配置压测策略的一个重要环节线程组决定了测试执行的请求数量 线程数 在这里线程数相当于一个虚拟用户每个线程数大约占内存1M特别注意⚠️ 单台机器最大线程数不要超过1000&#xff0c;不然可能会造成内存溢出 Ramp-Up时间 所有线程在多长时间内全部启动…