前端开发:Webpack的使用总结

news2024/11/29 22:44:27

前言

在前端开发过程中,尤其是现在前端框架的频繁使用的当下,作为前端开发者想必对于Webpack并不陌生,尤其是在使用Vue框架做前端开发的时候,打包时候必用Webpack。还有就是在前端求职面试的时候,Webpack相关的知识点也是面试官必定考察的,那么本篇博文就来分享一下关于Webpack使用相关的知识点,记录下来,方便后期查阅使用。

Webpack概念

Webpack其实是一个前端资源加载/打包工具,也就是自动化打包解决方案,即模块打包机,它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源,也就是把某些浏览器中不能直接运行的拓展打包成合适的格式来方便浏览器直接使用。

备注:Webpack也就是一个打包模块化的工具,在Webpack里面一切文件皆为模块,通过loader转换文件,使用plugin注入钩子,最后输出由多个模块组合成的文件。

 

Webpack打包原理

在项目开发过程中,大致分为两个状态:开发状态和生产状态。在这两种状态下,webpack在打包编译的时候,会采用不同的方式,比如代码是否压缩等。与这两种状态相对应,webpack的配置文件也要分为两个,一个用于开发时候的配置,一个用于上生产时候的配置。但是实际开发过程中,一般不是定义两个配置文件,而是三个,分别为:开发配置、生产配置和公有配置。这样比较便于管理webpack,更清晰地区分不同模式下的编译。

Webpack打包原理:把所有依赖打包成一个bundle.js,通过代码分割成单元片段按需加载。

Webpack核心内容

Webpack的核心主要有以下几个部分:

  1. mode —模式。development / production模式 ,根据模式来设置mode参数,可以启用相应模式下的 webpack 内置的优化。
  2. entry —入口。当前项目应该使用何模块,来作为构建其内部依赖的开始,即指定打包入口文件。
  3. output—出口。设置输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。
  4. loader —加载器。让webpack能够去处理那些非js文件,原因是webpack自身只能识别js。
  5. plugin—插件。可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。

 

另外,Webpack主要文件组成:

  • entry 入口,构建项目的起点位置,默认为./src/index.js
  • output 出口,打包之后的输出位置,默认为./dist
  • loader:加载器,让webpack拥有了加载和解析非JavaScript文件的能力
  • babel-loader:把 ES6 转换成 ES5
  • image-loader:加载并且压缩图片文件
  • css-loader:解析 CSS
  • plugin:插件,扩展webpack的功能,让webpack具有更多的灵活性。
  • define-plugin:定义环境变量
  • html-webpack-plugin: 压缩html

Webpack的安装

Webpack的安装,首先要确保已经安装了Node.js,因为Node.js自带了软件包安装工具npm。直接在电脑终端中输入命令行:node -v (查看当前node版本,而且要确保node版本大于8.9)

Webpack打包流程

Webpack打包流程分为:初始化参数、编译模块、输出资源。模块热更新,可使代码修改过后无需刷新浏览器就可局部更新,是高级版的自动刷新浏览器。主要的从启动到结束会依次执行以下流程:

 

1、全局安装Webpack

首先指定当前安装的版本是3.6.0,因为脚手架3.0依赖是该版本,命令行如下:

npm install webpack@3.6.0-g

2、局部安装Webpack

局部安装Webpack,使用--save-dev 开发的时候依赖,开发阶段才会用到,项目真正发布运行之后就不会再使用。

1⃣️在项目中安装局部的Webpack。脚手架升级到3.0就是Webpack4,配置文件会被隐藏,查看不方便。具体命令行如下所示:

npm install webpack@3.6.0--save-dev

2⃣️通过node_modules/.bin/webpack启动webpack打包。这个比较复杂,若想简单,需要在package.json中定义启动。具体步骤如下所示:

在package.json的scripts中定义执行脚本。package.json中的scripts的脚本在执行时,会按照一定的顺序寻找命令对应的位置。首先会寻找本地node_modules/.bin路径中对应的命令,若没有找到,会去全局的环境变量中继续寻找。(执行bulid指令:npm run build),文件内容如下所示:

{

  "name": "wechatui",

  "version": "3.0.0",

  "description": "",

  "author": "",

  "private": true,

  "scripts": {

    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",

    "start": "npm run dev",

    "test": "node build/test.js",

    "pre": "node build/pre.js",

    "build": "node build/build.js"

  },

  "devDependencies": {

    "webpack": "^3.6.0",

   }

}

 

Webpack的设置

1、定义webpack公有配置文件

webpack的公有配置文件的作用:就是将开发环境和生产环境共同的配置抽离出来。比如js文件和css文件的编译规则,编译的入口文件等。下面举一个简单的公有配置文件: webpack.base.js的例子,具体代码如下所示:

let path = require("path");

let Webpack = require('webpack');

module.exports = {

    entry: "./src/index.js",    // 打包的入口文件,默认是src目录下的index.js文件

    output: {                          // 配置文件默认是dist目录下的main.js文件

        filename: “out.js",     // 出口文件的文件名

        path: path.resolve(__dirname, "build"), //出口文件的路径

    }

}

公有配置文件完成之后,一般是不用这个文件进行webpack编译的,而是在此基础之上,再去定义开发环境的配置和生产环境的配置。

2、定义开发环境和生产环境的配置文件

需要使用一个第三方包: webpack-merge ,该包的作用就是把两个webpack配置文件合并成一个,用于开发或者生产环境的配置。执行以下命令安装该包:

npm i webpack-merge

安装完成之后就可以使用了。比如在 webpack.base.js 文件的基础上定义开发环境的配置 webpack.dev.js,就可以使用如下的写法:

let { smart } = require("webpack-merge");       // 引入smart方法

let base = require("./webpack.base.js");        // 引入公有配置文件

module.exports = smart(base, {    

    mode: "development",

    devServer: {

        port: 3000, // 指定开发服务器的端口

        progress: true, // 显示开启本地服务器的进度

        contentBase: "./build", // 指定本地服务默认打开目录

        compress: true, // 是否对代码进行压缩

    },

});

使用 webpack-merge 包可以将之间的配置文件作为参数,结合最新的配置参数,形成一个新的配置文件。采用这种方式,可以在项目中将开发配置、生产配置和公有配置分离成不同的文件,方便管理项目,提高开发效率。

提高webpack构建速度

在前端构建版本的时候,为了提高webpack构建速度,可以做以下处理:

  • 优化构建时的搜索路径;
  • 把不需要打包的插件换成全局"script"标签引入的方式;
  • babel-loader开启缓存;
  • 通过externals配置来提取常用库。

Webpack优点

Webpack的优点有很多,具体如下所示:

  • 专注于处理模块化的项目,能做到开箱即用,做到一步到位;
  • 扩展性很强,插件机制很完善;
  • 它的使用场景不局限于web开发;
  • 能被模块化的不仅有JS ,还有scss、TypeScript等。

Webpack缺点

事物都有两面性,有优点,就肯定有缺点。Webpack的缺点:只能用于采用模块化开发的项目,有很大的局限性。

最后

通过本文的介绍,在前端开发中关于webpack的使用就得心应手了,虽然该知识点比较难而且面比较广,但是重要和常用,尤其是对于刚接触前端开发不久的开发者来说更是如此,所以绝对掌握该知识点是很有必要的,不管是在实际开发中还是在前端求职面试中与webpack相关的都是必备知识点,它的重要性不再赘述。欢迎关注,共同进步。

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

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

相关文章

mysql新建分区设置阈值(less than)引发的问题

mysql新建分表后,入库之前分表区间的数据,但是再分表中查询不到对应数据。 文章目录问题背景问题解析新建分区sql查看分区查询数据查询数据所在分区修改方案总结LESS THAN相关sql查询分区删除分区先建分区问题背景 初始化表的时候,先建的日期…

(二)Jenkins全局工具配置

目录 1、插件管理 2、Gitee安装 2.1、插件安装 2.2、查看Gitee状态 2.3、配置Gitee 2.4、获取私人令牌 2.5、测试连接 3、全局配置jdk、ant、maven 3.1、jdk配置 3.2、ant配置 3.3、maven配置 4、插件镜像下载地址配置 (一)Jenkins部署、基础配置介绍在windows下安…

事务(transaction)

事务(重点 五颗星 ***** 必须理解 必须掌握) 1、什么是事务: 一个事务其实就是一个完整的业务逻辑。 假设转账,从A账户向B账户转账10000.将A账户的钱减去10000(update语句),将B账 户的钱增加100…

【手写 Vue2.x 源码】第二十六篇 - 数组依赖收集的实现

一,前言 上篇,主要介绍了数组依赖收集的原理 本篇,数组依赖收集的实现 二,对象依赖收集的总结 {}.dep > watcher 目前,“对象本身”和“对象中的每一个属性”都拥有一个 dep 属性,用于做依赖收集 此…

Leetcode:669. 修剪二叉搜索树(C++)

目录 问题描述: 实现代码与解析: 递归: 原理思路: 后序递归: 原理思路: 迭代: 原理思路: 问题描述: 给你二叉搜索树的根节点 root ,同时给定最小边界…

#9文献学习--基于元强化学习的边缘计算快速自适应任务卸载

文献:Fast Adaptive Task Offloading in Edge Computing based on Meta Reinforcement Learning 基于深度强化学习DRL的方法,样本效率很低,需要充分的再培训来学习新环境的更新策略,对新环境的适应性很弱。 基于元强化学习的任务…

【数据结构与算法】第十八篇:递归,尾递归,尾调用

知识概览一、递归的引入(递归现象)二、递归的调用过程与实例分析三、递归的基本思想小tip:链表递归的具体实例四、递归的一般使用条件五、实例分析:斐波那契数列1.原理剖析2.fib优化1 – 记忆化3.fib优化24.fib优化3六、实例分析:…

mac下ssh连接docker使用centos

配置ssh连接docker本机信息 Apple M2/ macOS Ventura 13.1完整实现如下:使用docker下载centos镜像docker pull centos:centos7 # centos7 指定安装版本查看本地镜像# 使用以下命令查看是否已安装了centos7➜ ~ docker images REPOSITORY TAG IMAGE ID …

c++通讯录管理系统

结构体1,知识点(结构体),存放人员详情,名字,性别,年龄等 struct person { string m_name; int m_sex; int m_age; string m_phone; string m_addr; };结构体2,知识点 (结…

狗厂的N+1+2毕业,我觉得还是挺良心的

最近又跟朋友打听到了新鲜事,年底的新鲜事,什么209万,就是听个乐子,离我太远,什么HR和技术人员产生矛盾,一巴掌眼镜都打飞了,好乱套,今天我跟朋友打听了一些不太乱套的 一、鹅肠 1.…

Quartz认知篇 - 初识分布式任务调度Quartz

定时任务的使用场景 在遇到如下几种场景可以考虑使用定时任务来解决: 某个时刻或者时间间隔执行任务 批量数据进行处理 对两个动作进行解耦 Quartz 介绍 Quartz 是一个特性丰富的、开源的任务调度库,几乎可以嵌入所有的 Java 程序,包括很…

基于二叉树的改进SPIHT算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

电脑怎么设置动态壁纸?关于Windows和Mac壁纸的设置方法

为了让电脑桌面更加美观舒适,很多人都会给电脑的桌面设置自己喜欢的壁纸。图片壁纸很多人都会设置,但是电脑怎么设置动态壁纸?这是很多人的困扰。其实方法同样很简单,下面有关于Windows和Mac动态壁纸的设置方法,一起来…

【阶段四】Python深度学习03篇:深度学习基础知识:神经网络可调超参数:激活函数、损失函数与评估指标

本篇的思维导图: 神经网络可调超参数:激活函数 神经网络中的激活函数(有时也叫激励函数)。 在逻辑回归中,输入的特征通过加权、求和后,还将通过一个Sigmoid逻辑函数将线性回归值压缩至[0,1]区间,以体现分类概率值。这个逻辑函数在神经网络中被称为…

PyCharm调用远程Python解释器

PyCharm调用远程Python解释器 PyCharm中直接调用远程服务器中Python解释器: 本地不用搭建Python环境。既避免了本地使用Window而服务器使用Linux系统不统一情况,又不用担心本地调试没问题而放到服务器上就出现问题。 PyCharm中打开项目并设置Python解释…

封装chrome镜像

chrome镜像 selenium提供了一个镜像,但这个镜像里面包含了比较多的东西: 镜像地址-github supervisord java chrome webDriver 实际的使用中遇到了一些问题 chrome遇到一些比较耗费内存和cup的操作的时候,有的时候会kill掉java进程&a…

干货 | 大数据交易所数据安全流通体系标准化尝试

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分:国内大数据交易所发展现状第二部分:国外大数据交易模式及法律法规欧盟的数据交易模式是基于2022年5月16日所提出的《数据治理法案》,其中提出了数据中…

【C++11】—— 包装器

目录 一、function包装器 1. function包装器基本介绍 2. function包装器统一类型 3. function包装器的使用场景 二、bind包装器 一、function包装器 1. function包装器基本介绍 function包装器 也叫作适配器。C中的function本质是一个类模板,也是一个包装器…

第四章 基本数据

在第2章中,我们讨论了多种导入数据到R中的方法。遗憾的是,将你的数据表示为矩阵或数据框这样的矩形形式仅仅是数据准备的第一步。这里可以演绎Kirk船长在《星际迷航》“末日决战的滋味”一集中的台词(这完全验明了我的极客基因)&a…

聚观早报|春节档新片预售总票房破千万;苹果获可折叠iPhone新专利

今日要闻:比亚迪据称拟在越南建汽车零部件厂;2023 年春节档新片预售总票房破 7000 万;苹果获得可折叠 iPhone 新专利;北京汽车获1000台EU5 PLUS约旦订单;娃哈哈要解决100万农户农产品出路 比亚迪据称拟在越南建汽车零部…