Webpack 基础配置介绍(二)

2023-10-31

今天继续分享webpack的有关内容!

我还是接着从上篇文章的项目来给大家分享后续内容,如果还有小伙伴没有阅读之前的文章,请关注博主进行阅读!


今日分享:

        1、webpack的规范配置;

        2、webpack.config.js基础配置;

        3、单页开发【单文件打包】;

        4、多页开发【多文件打包】;

        5、Glob配置动态入口打包多文件;

        6、哈希Hash;

        7、webpack、node 常用命令。

一、前言:

        提到 webpack 的配置方案、插件等,相信很多小伙伴都有了解,网上也有很多关于webpack的配置说明,但都是参差不齐。博主会通过后续的几篇文章,陆续带大家对它进行全面剖析!

二、Webpack环境配置、插件介绍

1、webpack的基础配置

webpack的配置分为三个部分:

为了实现webpack的规范化配置,很多文章所分享的内容不一,今天带大家进行规范化配置webpack的开发环境,总体来说包括开发配置的三个部分,开发环境、生产环境、测试环境

(1)开发环境不名思意,就是开发者开发时所处的阶段环境,此阶段开发者将获得最好的开发体验,这些都是得益于webpack针对开发环境提供的特性:

        ♣        浏览器调试工具

        ♣        注释、开发阶段的详细错误日志和提示

        ♣        快速和优化的增量构建机制

(2)生产环境此阶段是项目正式上线的环境,需要开发者在项目上线前,进行一些系列的配置、调试。在生产环境阶段,同样 webpack 官方提供了针对生产环境的特性:

        ♣        开启所有的优化代码

        ♣        更小的bundle大小

        ♣        去除掉只在开发阶段运行的代码

(3)测试环境测试阶段是整个项目的关键所在,也是距离项目正式上线的最后一步,需要前后端人员进行模拟、验证、调试,以此确保项目正式上线后能正常运行。

今天重点讲解前两个部分,测试环境涉及一些重点内容放在后面讲。

2、webpack 插件

        webpack是一项静态资源模块打包工具,为了实现轻量化标准,webpack对其自身进行了很大优化,分离一些自身携带的非必要功能插件,其自身内部携带的插件功能还是十分强大的,同时也有一些第三方插件,提供 预处理、源码的适配、代码压缩、CDN缓存、模块开发等多个方面。

接下来我们的项目中会用到插件,协助我们更加快捷、高效的开发。

三、正式开始项目:

想必大家都清楚,你的项目从无到有,需要经历一个漫长的过程,在团队一步步的研发过程中,会越来越复杂,需要的配置逐渐增多,需要的标志就会越多。在一定程度上意味着工程的配置管理变得混乱,变得愈来愈难以控制。那么该怎么办?

理所当然,必须得有管理配置的文件(工程配置文件)出现,来解决这个问题,有清晰的思路,自然一切也就迎刃而解,接下来就是规范配置的第一步:创建配置文件

STEP  01: 创建配置文件

在根个目录下新建一个目录build,而后创建文件webpack.config.js,作为配置文件置于该目录下

用于对项目配置信息的管理,也是配置webpack要做的事情。

STEP  02: 配置文件添加配置

现在创建的文件是空白文件,作为配置文件,将会导出一个对象的 JavaScript 文件,需要进一步配置:

 你以为就这样结束了吗?不,远远没有

Webpack 配置是标准的 Node.js CommonJS模块,通过require来引入其他模块,通过module.exports 导出模块,由 Webpack 根据对 对象定义的属性进行逐步解析。

以上很简单,到目前为止只是通过 entry设置了入口起点,然后通过output配置了打包文件的输出,发现还有其他模块没有配置,不要着急,脚踏实地一步一步来,后面会带大家把里面的内容补全,还有一点,随着后面的配置越来越来多,整个webpack也会越来越复杂。

STEP  03: 依据配置打包文件

完成以上配置后,进入到package.json包管理文件,并在scripts脚步命令配置模块添加

"build": "webpack --config ./build/webpack.config.js"

 按照上面这种方式处理,会极大地简化我们使用的命令,如上配置后,在终端可以执行

 npm run build

 执行上面的命令,可以在 dist 下面看到打包结果

上面的命令执行效果与前面提到的webpack src/index.js --output dist/bundle.js --mode none等同。同样有警告信息,主要是mode的配置没有添加。在上面的配置中添加:

"build": "webpack --config ./build/webpack.config.js --mode production"

在原命令后面追加 --mde production

再次执行npm run build,不会再有警告信息。

STEP  04: 配置单、多文件的打包方式

可以看到上面都只是针对单文件打包,那么问题来了,

在实际项目开发过程中,随着模块增多、功能多样化需求,导致需要依赖的文件越来越多,其中多文件打包是必然要考虑的一个问题,究竟该如何处理?(小伙伴们可以把自己的想法展现在下面评论区)

下面博主给大家分享几种多文件打包的方式:

上面是但文件打包,必须使用path.resolve来生成相对于当前目录的绝对路径,作为入口文件;

之所以要给大家分享多文件打包方式,是因为项目中不同的功能模块都是需要各自独立开发的,避免互相影响,会出现有多个入口文件的情况,此时多文件打包的优势是不是瞬间就体现出来了!

多文件打包:

进行多文件打包之前,需要提前创建几个需要打包的 JS 文件

方式一:多文件合并打包

entry:["../src/test.js", "../src/main.js"],
    
output: {
    path: DIST_PATH,
    filename: 'bundle.js'
}

方式二:多文件独立打包

entry: {
    main: "../src/main.js", 
    test: "../src/test.js
},
    
output: {
    path: DIST_PATH,
    filename: '[name].js'
}

方式三:多文件独立打包(其他方式)

注意:使用之前,需要插件 glob 的配合。

Glob 插件,使用此插件可以配置动态的文件入口,提供多个文件打包的独立输出。

Glob 插件属于非官方插件(第三方),使用之前,需要安装:

npm install glob@7.1.7 --save-dev

由于插件更新较快,所以可以根据自己需求安装任何版本。

安装成功以后,需要在配置文件中引入模块,然后配合使用

var glob = reuqire("glob");

借鉴第二种方式,对第三种的文件打包方式做一个提升:

既然文件独立打包,入口文件必须是一个键值对的形式,那么我们可以试着往这个点去扩展,

在全局做一个处理,对需要打包的文件通过键值对形式存入到对象中,赋值给入口就行了!

 顺着这个思路,我们接着往下处理:

        首先,需要找到待处理的文件路径;

var webpack = require("webpack");

var path = require("path");

var glob = reuqire("glob");

var DIST_PATH = path.resolve(__dirname, "../dist");

var SRC_PATH = path.resolve(__dirname, "../src");


var newEntries = {};

// var files = glob.sync(path.join(SRC_PATH, "/*.js"));
var files = glob.sync(SRC_PATH + "/*.js");

        其次,通过循环查找遍历出每个文件;

        然后,对遍历出的每个文件的相关信息进行提取,作为 KEY:VALUE形式;

file.forEach((file, index) => {

    // file-name
    var substr = file.match(/src\/(\S*)\.js/);

    // add
    newEntries[substr] = file;

});

        最后,放入一个目标对象中,作为入口即可。

module.exports = {
    entry: newEntries,

    output: { // Webpack所创建的bundle文件
        path: DIST_PATH,
        filename: '[name].js' // 多文件独立打包
    },

    // 模块解析
    module: {},

    // 插件
    plugins: [],

    // 开发服务器
    devServer: {}
};

以上四个步骤,是我们处理多文件独立打包输出的一种方式,还有很多方式,小伙伴也可以积极思考,有想法可以在下面评论区回复博主哦!

STEP  05: 配置开发服务器

项目做到此处,不知道小伙伴们对上面的内容掌握了多少?

接着,我们可以试着修改/src/main.js的代码:

alert(`Hello, Webpack! Let's Go`);

重新编译之后,打开/dist/index.html你会发现浏览器会弹出alert()框:

为了开发方便,不可能通过node或其他类型的即时服务来启用一个服务。我们可以把这部分事件放到开发服务器中来做,对应的就是devServer,所以我们接着在webpack.config.js中添加devServer相关的配置:

webpack-dev-server 插件:

webapck-dev-server 是可以一款快速搭建本地运行环境的工具。webpack-dev-server 是一个小型的 NodeJS + Express 服务器,它使用 webpack-dev-middleware 来服务于webpack包,此外,它还有一个 Sock.js 来连接到服务器的微型运行时。

命令简单 webpack-dev-server 或配置命令脚本快捷运行,模拟服务器运行情况,进行上线之前的调试。

使用需要安装:npm install webpack-dev-server --save-dev

webpack-dev-server 与 webpack-dev-middleware究竟是什么?

webpack-dev-server:

webpack-dev-server 相当于启动了Express 的HTTP服务器+调用webpack-dev-middleware。这个 HTTP 服务器和client 使用了websocket 协议,在原始文件做出改动之后,webpack-dev-server会使用webpack实时编译,再用webpack--dev-middleware将webpack编译后的文件实时输出到内存中。

适合纯前端项目,很难编写后端服务,进行整合。

webpack-middleware:

webpack-dev-middleware 输出的文件存在于内存中。

你定义了 webpack.config,webpack 就能据此梳理出 entry 和 output 模块的y依赖关系,而 webpack-dev-middleware 就在此基础上形成一个文件映射系统,每当应用程序请求一个文件,它匹配到了就把内存中缓存的对应结果以文件的格式返回给你,反之则进入到下一个中间件。

因为是内存型文件系统,所以重建速度非常快,很适合于开发阶段用作静态资源服务器;因为 webpack 可以把任何一种资源都当作是模块来处理,因此能向客户端反馈各种格式的资源,所以可以替代HTTP 服务器。事实上,大多数 webpack 用户用过的 webpack-dev-server 就是一个 express+webpack-dev-middleware 的实现。

二者的区别仅在于 webpack-dev-server 是封装好的,除了 webpack.config 和命令行参数之外,很难去做定制型开发。而 webpack-dev-middleware 是中间件,可以编写自己的后端服务然后把它整合进来,相对而言比较灵活自由。

了解上面这些知识点后,我们来配置开发服务器:

    devServer: {

        hot: true,

        contentBase: DIST_PATH, // 需更新的目标目录

        host: 'localhost', // 主机地址,默认是localhost,你也可以指定地址

        port: 8080, // 端口 

        historyApiFallback: true,// 该选项的作用所有404都连接到index.html 

        // info: true, // 只针对Cli,默认是启用的,不要随意设定,否则项目启动不了。

        noInfo: false, // 是否需要实时显示并输出打包信息

        proxy: { // 代理

            "/api": "http://localhost:3000" // 拦截所有以api开头的请求地址,代理到后端地址

        }
    }

以上的几个是最常用的配置项,还有很多配置项,小编就不再一 一介绍了,有疑问可以在评论区回复!

对开发服务器配置完毕之后,还没有结束,需要在package.json文件中配置快捷启动服务的命令,

"scripts": {
    "dev": "webpack-dev-server --config ./build/webpack.config.js",
}

做完上面这些处理之后,在dist目录下新建一个html文件,script方式引入JS文件,尝试使用下面的命令来启动项目,

npm run dev

这是我们正常启动后的界面:

既然项目配置了热启动,那么我们尝试修改src/main.js中的内容,检测热启动是否会实时刷新并渲染页面,在JS文件中添加如下代码:

document.addEventListener("DOMContentLoaded", function(ev){
    var dom = document.createElement("div");
    document.body.append(dom);
    dom.innerText = "Hello Webpack ^_^ !";
    dom.style.color = "#f46";
});

 根据上面的场景测试后,发现无需手动刷新,浏览器会自动刷新并渲染页面。

四、Hash哈希:

下面,我们来思考一个问题:

我们的项目开发时,其中的文件在不断变化,等项目正式上线后,开发人员需要不断地迭代优化更新我们的项目文件,那么这个时候,我们需要对修改过的文件做标记,便于客户端从服务器拉取数据,更新CDN缓存,那么hash就可以满足我们这一需求。

那么如何设置文件的hash呢?

需要在我们的配置文件中做设置,还记得文件的输出吗,output出口 正是对我们打包文件输出的配置,需要对文件的名称做出改变,添加 hash,

filename: '[name][hash:8].js' // 设置 hash 值

这样处理 文件的hash值,虽然目的达到了,但是也会存在缺点,我们不推荐使用hash,建议用chunkhash:

原因:
1、使用 hash,并且使客户端做了CND缓存,如果修改了某个/某几个JS文件,则会导致所有文件的 hash 发生变化并且所有文件再产生一个hash文件(相当于备份的形式但每个文件的 hash值 不一样);虽然把 hash 做了变化,但是对CDN缓存没有起到任何作用,还把文件名字改了,这样做客户端的CDN缓存根本无法识别究竟 是哪些文件做了改变,哪些没有改变,也就无法服务端拉取数据,更新缓存;
2、使用 chunkhash,只会修改被改动的文件的 hash 值)

为了更形象,我给大家放两张图,说明一下hash的缺点:

从上面两幅图可以看出,无论是否修改源文件,再次打包都会修改hash值,并创建备份。

另外,还以一种hash格式——contenthash

它主要针对 CSS 文件,不会因为JS文件引用了某个/某些 CSS 文件,而导致CSS文件的哈希值发生改变。

我们依然两幅图来说明 contenthash:

 从上面两幅图可以看出,只有发生改变的源文件,再次打包才会修改hash值,并创建备份,反之,没有发生改变的源文件的hash是不会发生改变的。

一般我们在项目中,sass、less等其他格式的样式文件,都会通过打包到JS文件加载到页面中,

有时候我们是需要做缓存的,把他们抽出为一个单独的 CSS 文件,抽出CSS就是为了做CDN缓存,有些文件的CSS样式是不需要修改的,把它们抽离出来单独放到一个文件,这样可以提高用户访问产品的性能。

在chunkhash的例子,我们知道由于index.css被index.js引用后加载到页面中,所以共用相同的chunkhash值。
但是这样子有个问题,如果index.js更改了代码,css文件就算内容没有任何改变,由于是该模块发生了改变,导致css文件会重复构建。

这个时候,我们可以使用 extra-text-webpack-plugin里的contenthash 值,保证即使css文件所处的模块里就算其他文件内容改变,只要css文件内容不变,那么不会重复构建。

五、打包之前删除某个文件夹:

项目打包之前需要删除某个文件夹之后,再执行打包,需要插件 rimraf的使用,使用之前也是需要安装该插件:

npm install rimraf --save-dev

dist文件夹在每次项目打包的时候都会有非常多的文件,需要删除后重新打包,那么就可以使用它来配合实现。

在package.json中的打包命令同样也要配置:

"build": "rimarf dist && webpack --config ./build/webpack.config.js --mode production",

以上的文件删除命令,Node中的删除文件命令同样可以使用,可以不同安装插件

"build": "rm -rf dist && webpack --config ./build/webpack.config.js --mode production",

好了,各位小伙伴,今天博主的分享到此结束了,下一期是 webpack 的优化篇!

再次感谢各位的支持,如果对博主文章满意的话,请给点个赞哦  ^_^!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Webpack 基础配置介绍(二) 的相关文章

随机推荐

  • AOP源码解析(2)AnnotationAwareAspectAutoProxyCreator---Spring源码从入门到精通(十九)

    上篇文章主要讲了AOP的 EnableAspectAutoProxy注解 里面导入的类和执行的后置处理器 AOP源码解析 1 Spring源码从入门到精通 十八 阅读本篇文章 一定要先阅读上篇文章 运行的源码是基于上篇文章的代码 才方便理解
  • DERT:End-to-End Object Detection with Transformers

    文章目录 摘要 1 简介 2 相关工作 2 1 集合预测 2 2 Transformer与并行解码 2 3 目标检测 3 DETR模型 3 1 目标检测集合预测损失 3 2 DETR架构 4 实验 4 1 与Faster R CNN的对比
  • 【UE 粒子练习】06——创建条带类型粒子

    效果 下图呈现的是一种条带粒子跟随普通粒子移动的效果 其中 条带粒子为下图中蓝色部分 橙色部分为普通粒子 步骤 1 新建一个材质 命名为 Mat Ribbon 将用于条带粒子材质 材质域设置为表面 混合模式设置为半透明 着色模型设置为无光照
  • Java、python及phpstudy的环境配置

    由于重装了系统 电脑上啥都没了 正好借此机会写一些从空白开始配置新电脑 希望多踩一点坑 才能帮更多的人解决问题 本文是小白向的 学习过程中看到一些教程缺胳膊少腿 可能会漏掉一些博主觉得easy但是是我不确定的点的地方 所以本篇可能有点啰嗦
  • 期望、方差、协方差与相关系数

    1 利用切比雪夫不等式可以证明方差为0意味着随机变量的取值集中在一点上 2 从协方差可以得到两个变量增减的趋势 称为相关性 3 不相关 比 独立 更弱的概念 独立 必导致 不相关 不相关 不一定导致 独立 4 相关系数是相应标准化变量的协方
  • 使用Termux在安卓手机上运行tomcat服务器

    使用Termux在安卓手机上安装运行tomcat服务器 简单背景 探索尝试 尝试一 使用limbo虚拟机 失败 想念二 使用Linux Deploy安装 直接放弃 尝试三 使用Aid Learning 成功但搁置 尝试四 使用Termux直
  • Django之数据库并发处理

    1 数据库并发处理问题 在多个用户同时发起对同一个数据提交修改操作时 先查询 再修改 会出现资源竞争的问题 导致最终修改的数据结果出现异常 比如限量商品在热销时 当多个用户同时请求购买商品时 最终修改的数据就会出现异常 下面我们来写点代码还
  • getline()的使用详解

    一 getline int main string line while getline cin line cout lt
  • 图像去噪的OPenCV添加噪声和去噪

    添加噪声 添加高斯噪声 IplImage AddGuassianNoise IplImage src 添加高斯噪声 IplImage dst cvCreateImage cvGetSize src src gt depth src gt n
  • sass的日常使用

    sass跟css的简单对比 css 由于CSS的语法不够强大 没有变量和合理的样式复用机制 使得逻辑上相关的属性值必须以字面的形式反复出现 导致难以维护 而动态演示语言为CSS赋予了动态语言的特性 极大的提高了样式语言的可维护性 sass
  • github.com访问慢解决

    修改hosts HOSTS文件路径 C Windows System32 drivers etc hosts 1 打开Dns查询 站长工具 http tool chinaz com dns 2 搜索http github com 3 把TT
  • 使用Linux内核里的spi屏驱动-fbtft

    Linux内核里已经提供spi接口小屏的设备驱动 在内核的配置选项 make menuconfig ARCH arm CROSS COMPILE arm linux gnueabihf Device Drivers gt Graphics
  • 多线程练习之:生产电脑

    生产电脑 题目 设计一个生产电脑和搬运电脑类 要求生产出一台电脑就搬走一台电脑 如果没有新的电脑生产出来 则搬运工要等待新电脑产出 如果生产出的电脑没有搬走 则要等待电脑搬走之后再生产 并统计出生产的电脑数量 public class Co
  • python乘法出现小数位很多_js小数运算出现多位小数如何解决

    小数相乘出现很多位小数的问题 这个问题自己以前也遇到过 现在特意来总结一下 Number类型 Number类型是ECMAScript中最常用和最令人关注的类型了 这种类型使用IEEE754格式来表示整数和浮点数值 浮点数值在某些语言中也被成
  • 字节跳动前端面经

    面试经历 我入职字节大概一个多月 目前准大四 实习生 现在写面经不仅仅是牛客网 YYSD 真tm灵 的还愿 还是就是想给大家推荐推荐我们部门 技术中台 可能大家对技术中台不太了解 但是大家肯定听说过掘金吧 我们组主要负责ByteTech 字
  • 相机的信噪比

    在图像传感器的成像过程中 真实的信号是无法探测到的理想值 在成像过程中理想值被引入了一系列的不确定性 最终形成读出信号也即图像 此过程中的不确定性被统一称为噪声 而信号与噪声的比值被定义为信噪比 Signal to NoiseRatio S
  • hibernate: Duplicate class/entity; Could not parse mapping document from resource

    近日在学习Hibernate时 总是遇到以下异常 org hibernate InvalidMappingException Could not parse mapping document from resource kpy db Cus
  • ModelScope-Agent: Building Your Customizable Agent System with Open-source Large Language Models

    本文是LLM系列文章 针对 ModelScope Agent Building Your Customizable Agent System with Open source Large Language Models 的翻译 ModelS
  • 1072. 开学寄语(20)

    下图是上海某校的新学期开学寄语 天将降大任于斯人也 必先删其微博 卸其QQ 封其电脑 夺其手机 收其ipad 断其wifi 使其百无聊赖 然后 净面 理发 整衣 然后思过 读书 锻炼 明智 开悟 精进 而后必成大器也 本题要求你写个程序帮助
  • Webpack 基础配置介绍(二)

    今天继续分享webpack的有关内容 我还是接着从上篇文章的项目来给大家分享后续内容 如果还有小伙伴没有阅读之前的文章 请关注博主进行阅读 今日分享 1 webpack的规范配置 2 webpack config js基础配置 3 单页开发