Webpack 插件开发如此简单!

本文详细介绍了如何开发一个Webpack插件,以解决项目中index.js文件缓存问题。通过理解Webpack插件的基本结构和事件钩子,作者创建了一个SetScriptTimestampPlugin,该插件在HTML文件生成前动态添加时间戳到脚本引用,避免CDN缓存。此外,还探讨了如何读取插件配置参数和扩展插件功能。
摘要由CSDN通过智能技术生成

【Webpack】🔥Webpack 插件开发如此简单!

本文使用的 Webpack-Quickly-Starter快速搭建 Webpack4 本地学习环境。
建议多阅读 Webpack 文档《 Writing a Plugin》章节,学习开发简单插件。

本文将带你一起开发你的第一个 Webpack 插件,从 Webpack 配置工程师,迈向 Webpack 开发工程师!
做自己的轮子,让别人用去吧。

完整代码存放在: https://github.com/pingan8787/script-timestamp-webpack-plugin

一、背景介绍

本文灵感源自业务中的经验总结,不怕神一样的产品,只怕一根筋的开发

在项目打包遇到问题:“当项目托管到 CDN 平台,希望实现项目中的 index.js 不被缓存”。因为我们需要修改 index.js 中的内容,不想用户被缓存。

思考一阵,有这么几种思路:

  1. 在 CDN 平台中过滤该文件的缓存设置;
  2. 查找 DOM 元素,修改该 script 标签的 src 值,并添加时时间戳;
  3. 打包时动态创建 script 标签引入文件,并添加时时间戳。

(聪明的你还有其他方法,欢迎讨论)

思路分析:

  1. 显然修改 CDN 设置的话,治标不治本;
  2. 在模版文件中,添加 script 标签,执行获取 Webpack 自动添加的 script 标签并为其 src 值添加时间戳。但事实是还没等你修改完, js 文件已经加载完毕,所以放弃
  3. 需要在 index.html 生成之前,修改 js 文件的路径,并添加时间戳。

于是我准备使用第三种方式,在 index.html 生成之前完成下面修改:
image.png

问题简单,实际还是想试试开发 Webpack Plugin。

二、基础知识

Webpack 使用阶段式的构建回调,开发者可以引入它们自己的行为到 Webpack 构建流程中。
在开发之前,需要了解以下 Webpack 相关概念:

2.1 Webpack 插件组成

在自定义插件之前,我们需要了解,一个 Webpack 插件由哪些构成,下面摘抄文档:

  • 一个具名 JavaScript 函数;
  • 在它的原型上定义 apply 方法;
  • 指定一个触及到 Webpack 本身的 事件钩子;
  • 操作 Webpack 内部的实例特定数据;
  • 在实现功能后调用 Webpack 提供的 callback。

2.2 Webpack 插件基本架构

插件由一个构造函数实例化出来。构造函数定义 apply 方法,在安装插件时,apply 方法会被 Webpack compiler 调用一次。apply 方法可以接收一个 Webpack compiler对象的引用,从而可以在回调函数中访问到 compiler 对象。

官方文档提供一个简单的插件结构:

class HelloWorldPlugin {
   
  apply(compiler) {
   
    compiler.hooks.done.tap('Hello World Plugin', (
      stats /* 在 hook 被触及时,会将 stats 作为参数传入。 */
    ) => {
   
      console.log('Hello World!');
    });
  }
}
module.exports = HelloWorldPlugin;

使用插件:

// webpack.config.js
var HelloWorldPlugin = require('hello-world');

module.exports = {
   
  // ... 这里是其他配置 ...
  plugins: [new HelloWorldPlugin({
    options: true })]
};

2.3 HtmlWebpackPlugin 介绍

HtmlWebpackPlugin 简化了 HTML 文件的创建,以便为你的 Webpack 包提供服务。这对于在文件名中包含每次会随着编译而发生变化哈希的 webp

最低0.47元/天 解锁文章
prepack的一个webpack插件
08-10
prepack的一个webpack插件
webpack-plugin-serve:Webpack插件中的开发服务器
02-23
webpack-plug-serve 插件中的Webpack开发服务器。 阅读以下文档后,请确保并仔细阅读 。 如果您认为该项目有用,请考虑捐赠。 要求 webpack-plugin-serve是 模块。 该模块需要节点版本(v10.0.0 +)。 此模块中的客户端脚本需要。 用户还可以选择通过适当配置的 Webpack加载器来编译客户端脚本,以在较旧的浏览器中使用。 功能奇偶校验 从许多方面来说, webpack-plugin-serve其他方案webpack-plugin-serve突出。 与现有解决方案的功能均等是当务之急。 如果您期望替代产品中的某个功能无法直接使用,则很可能可以通过中间件轻松实现。 随意提出一个方向的问题。 对于那些对直接比较感兴趣的人,请参阅,以了解webpack-plugin-serve和其他功能之间的功能比较细分。 安装 使用npm: npm
Webpack: 插件开发之提升插件健壮性
最新发布
Wang的专栏
07-03 968
前文中,我们了解了 Webpack 插件开发方式与基本架构逻辑,并结合若干开源项目剖析插件中如何与 Webpack 上下文交互,从而修改构建逻辑,实现插件功能需求。如何正确处理插件日志;如何上报统计信息,帮助用户更好了解插件的运行情况;如何借助校验配置参数;如何搭建自动测试环境。我们应该尽量复用 Webpack Infrastructure Logging 接口记录插件运行日志若插件运行耗时较大,应该通过接口上报执行进度,供用户了解运行状态应该尽可能使用。
如何用webpack开发一个插件
qq_37833745的博客
08-09 1012
目标: 我没想要开发一个插件,用来删除 打包文件 (dist/*.js) 的注释 前言: webpack 要求插件,必须是一个函数或者是一个包含 apply 方法的对象 emit 钩子:是 webpack即将往输出目录输出时执行的钩子函数 1:在 webpack.config.js 里面定义 插件 并 加载插件 我们自定义一个插件插件名字叫 MyPlugin // 定义插件:MyPlugin class MyPlugin { // apply()在...
如何开发 webpack 插件
m0_61998604的博客
05-23 1043
开发Webpack插件
Webpack插件开发简要
hsany330的专栏
09-11 169
如今‘大前端’这个概念在前端界大热,说‘大前端’,我们就要提到‘前后端分离’,‘前后端分离’又离不开‘本地开发构建’,‘本地开发构建’自然离不开webpackwebpack想要工作,那它就需要各种插件的支持,O(∩_∩)O哈哈~,逗了一大圈,终于引出了主题。 相信有不少童鞋在平时的项目开发中使用过Webpack Plugins,然而大部分人真是‘使用’啊(包括之前的我),只有少数人会去深究插件...
webpack插件开发
贪睡的小聪
10-14 1402
记一次webpack插件开发 需求背景,由于public里面包含另外一个项目,每次项目里面的index.html 都被缓存在客户端造成所以使用一个插件改造打包后路径,并修改文件md5 开始编写插件 新建一个puglin文件,放在哪里无所谓,只要你能找到就可以了 class SetScriptMD5Plugin { // apply 函数 compiler-联系webpack 过程中的上下文 apply(compiler) { } } module.exports
webpack_examples:简单Webpack示例
05-20
4. **插件(Plugins)**:插件可以扩展Webpack的功能,执行更复杂的任务,如优化、提取CSS到单独文件、自动添加版权信息等。例如,使用`HtmlWebpackPlugin`自动生成HTML文件: ```javascript const ...
小程序应用less(VScode版)
01-20
如果你的项目已经配置了Gulp或Webpack,它们通常具备更复杂的构建流程和更强大的功能,此时`.easy Less`插件可能显得较为简单,但仍然可以作为一个快速且轻量级的解决方案。 总的来说,通过在VScode中安装和配置`....
rick石
02-20
并非如此简单的React/无用样板。 它包含: 一般的: Webpack(设置3个配置文件) 图加载器 字体加载器 别名:“〜” ==“ ./src/” 自动捆绑注入(html-webpack-plugin) CSS模块 样式组件 准备好 发展: 实用...
一篇文章带你从零快速上手Rollup
10-14
尽管Webpack提供了强大的代码分割、静态资源处理和热模块替换功能,但在某些场景下,如只需要打包单一bundle且基于ES6模块开发时,Rollup的Tree-shaking优势和简洁的API使其成为更好的选择。然而,随着Webpack 2.0及...
使用 webpack 各种插件提升你的开发效率
weixin_30793643的博客
03-12 182
前沿 项目地址 vue-admin 欢迎 star 近几个月,接手了一个老项目的重构规划,有多老呢?就是前端青铜时代的项目,一个前后端都在同一个锅里的项目、完全没有使用任何的打包工具。 后台 php + YII 渲染页面 前端 html、css、js三剑客 加上 jQuery 复制粘贴就是干。 前端不够后端来凑。如果前端有一些需求不是很复杂的话,后端人员有时候也会兼顾的干一些前端的活。 后...
Webpack 插件开发指南
_
02-05 659
原文链接: https://juejin.cn/post/6844904070868631560 本文将带你一起开发你的第一个 Webpack 插件,从Webpack 配置工程师,迈向 Webpack 开发工程师!做自己的轮子,让别人用去吧。 一、背景介绍 本文灵感源自业务中的经验总结,不怕神一样的产品,只怕一根筋的开发。 在项目打包遇到问题:“当项目托管到 CDN 平台,希望实现项目中的 index.js 不被缓存”。因为我们需要修改index.js中的内容,不想用户被缓存。 思考一阵,有...
Webpack 插件开发以及插件理解
《春馨梦》的专栏
01-19 532
插件1 => ConsoleLogOnBuildWebpackPlugin.js function ConsoleLogOnBuildWebpackPlugin() { console.log(" 咋办 我被调用了....... "); } ConsoleLogOnBuildWebpackPlugin.prototype.apply = function(compiler) {
webpack开发自定义功能插件
问白的博客
03-27 3878
webpack 插件开发 简介 使用webpack开发一些自定义功能的插件,最主要的目的是了解webpack工作流的方式,更深层次的认识和了解webpack工作原理,这样以后如有需要,也可结合自身所在业务去定制不同的插件,来提高开发效率。 webpack提供的hook(钩子) 在webpack整个工作流中在不同的阶段对外提供了不同的hook,使得开发者可以利用这些钩子做一些自己定制化功能的plug...
webpack插件
2197
08-06 199
1>插件分为 内置插件(不需要安装和引用可以直接使用)和第三方插件(需要npm安装,require引用) 2>常用的内置插件 1》UglifyJsPlugin   new webpack.optimize.UglifyHJsPlugin([options]) 解析/压缩/美化所有的js chunk(块) 2》DedupPlugin    new webpack.optimiz...
简单开发webpack插件
weixin_40429706的博客
10-07 116
name:决定用户下载你的插件时用的名称,不可与 npm 上已有的第三方包重名,否则无法发布;repository:如果你的插件代码放在 github、gitee 等网站,可以填一下;version:每次更新发布时,需要与上一版本的版本号不一样,否则上传不成功;main:插件主文件入口,Webpack 引入插件时,就从该目录导入;private:不能设置为 true,否则无法发布;编写index.js。
如何编写一个WebPack插件原理及实践
hsany330的专栏
09-11 557
阅读目录 一:webpack插件的基本原理 二:理解 Compiler对象 和 Compilation 对象 三:插件中常用的API 四:编写插件实战 回到顶部 一:webpack插件的基本原理 webpack构建工具大家应该不陌生了,那么下面我们来简单的了解下什么是webpack插件。比如我现在写了一个插件叫 "kongzhi-plugin" 这个插件。那么这个插件在处理webpa...
R! While resolving: webpack@1.0.0 npm ERR! Found: webpack@3.12.0 npm ERR! node_modules/webpack npm ERR! dev webpack@"^3.6.0" from the root project
06-10
这个错误信息显示您的项目使用了webpack@1.0.0版本,但是您安装的css-loader@6.8.1需要使用peer dependency webpack@^5.0.0。而且您的项目中使用的webpack版本是3.12.0,低于css-loader需要的5.0.0版本,因此导致依赖冲突。 解决方法是升级您的webpack版本到5.0.0及以上,或者降低您安装的css-loader版本,例如安装4.x版本的css-loader: ``` npm install --save-dev css-loader@4 ``` 但是请注意,降低版本可能会导致某些功能无法正常工作。建议您尽可能升级webpack版本以保持兼容性。
写文章

热门文章

  • 解决老浏览器不支持ES6的方法 58433
  • 分享 6 个 Vue3 开发必备的 VSCode 插件 17234
  • 简单易懂的 React useState() Hook 指南(长文建议收藏) 16729
  • 聊聊技术选型 - Angular2 vs Vue2 16375
  • 【TS】566- 一文读懂 TS 中 Object, object, {} 类型之间的区别 16277

分类专栏

  • Cute-JavaScript 81篇
  • 1-HTML + CSS
  • 2-HTML5 + CSS3
  • 3-JavaScript 74篇
  • 4-Vuejs2.0 3篇
  • 5-Nodejs 1篇

最新评论

  • 【总结】1900- 如何从Webpack迁移到Vite

    小鸣同xio: npm install –save vite 应该是 npm install ––save vite

  • 【总结】1739- 使用 Pake 一键将网页打包成桌面 App

    心肝到爆: 有网络请求,应该怎么处理网络请求

  • 【AI】2076- 豆包 AI 全新桌面客户端体验,你的超级桌面 AI 助手

    CSDN-Ada助手: 推荐 Python入门 技能树:https://edu.csdn.net/skill/python?utm_source=AI_act_python

  • 【CSS】519- grid-auto-flow深入理解

    hjn686868hjn: 作者加油,写的太好了

  • 分享 6 个 Vue3 开发必备的 VSCode 插件

    社会广: 话说第一个插件是不是改了,名字变成了vue-official,但是id仍然是Vue.volar,难道被vue官方给招安了?

最新文章

  • 【总结】2132- 10 分钟带你构建monorepo架构,前端通用自动化 CI/CD 方案
  • 【Web技术】2131- 一个前端非侵入式骨架屏自动生成方案
  • 【总结】2130- 8 个解决移动端1px 边框困境的方案
2024
08月 15篇
07月 31篇
06月 29篇
05月 35篇
04月 32篇
03月 32篇
02月 29篇
01月 31篇
2023年372篇
2022年360篇
2021年416篇
2020年464篇
2019年261篇
2017年4篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码塘坑网站关键词优化龙华企业网站改版永湖如何制作网站松岗百度网站优化松岗百度网站优化平湖网络推广西乡标王南山网站改版大浪百搜标王大鹏模板网站建设南联网站seo优化南澳外贸网站设计大鹏百度竞价包年推广石岩网络推广南联百度网站优化广州网站改版龙岗网络广告推广观澜外贸网站设计荷坳外贸网站制作惠州网站建设民治建网站沙井网站优化按天收费南山网络营销民治关键词按天收费横岗模板制作西乡百度爱采购松岗seo优化南联网页制作横岗网络营销荷坳营销型网站建设歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化