使用 webpack-dev-server 监听客户端的热更新事件?

2024-02-18

这是一个有点边缘的情况,但了解一下会很有帮助。

当使用 webpack-dev-server 开发扩展以使扩展代码保持最新时,监听“webpackHotUpdate”会很有用

带有内容脚本的 Chrome 扩展通常有两个方面:

  1. 背景
  2. 注入的内容脚本

当将 webpack-dev-server 与 HMR 一起使用时,后台页面保持同步就好。但是,内容脚本需要重新加载扩展才能反映更改。我可以通过侦听来自 hotEmmiter 的“webpackHotUpdate”事件然后请求重新加载来解决此问题。目前我的工作方式很糟糕而且非常不可靠。

var hotEmitter = __webpack_require__(XX)

hotEmitter.on('webpackHotUpdate', function() {
    console.log('Reloading Extension')
    chrome.runtime.reload()
})

XX 仅代表当前分配给发射器的编号。正如您可以想象的那样,每当构建发生变化时,它就会发生变化,因此这是一个非常临时的概念证明之类的事情。

我想我可以设置自己的套接字,但这似乎有点矫枉过正,因为事件已经被传输,而我只是想听。

我最近才更加熟悉 webpack 生态系统,因此非常感谢任何指导。


Okay!

我通过环顾四周解决了这个问题:

https://github.com/facebookincubator/create-react-app/blob/master/packages/react-dev-utils/webpackHotDevClient.js https://github.com/facebookincubator/create-react-app/blob/master/packages/react-dev-utils/webpackHotDevClient.js

非常感谢 create-react-app 团队明智地使用评论。

我创建了一个精简版本,专门用于处理扩展开发的重新加载条件。

var SockJS = require('sockjs-client')
var url = require('url')

// Connect to WebpackDevServer via a socket.
var connection = new SockJS(
    url.format({
        // Default values - Updated to your own
        protocol: 'http',
        hostname: 'localhost',
        port: '3000',
        // Hardcoded in WebpackDevServer
        pathname: '/sockjs-node',
    })
)

var isFirstCompilation = true
var mostRecentCompilationHash = null

connection.onmessage = function(e) {
    var message = JSON.parse(e.data)
    switch (message.type) {
        case 'hash':
            handleAvailableHash(message.data)
            break
        case 'still-ok':
        case 'ok':
        case 'content-changed':
            handleSuccess()
            break
        default:
        // Do nothing.
    }
}

// Is there a newer version of this code available?
function isUpdateAvailable() {
    /* globals __webpack_hash__ */
    // __webpack_hash__ is the hash of the current compilation.
    // It's a global variable injected by Webpack.
    return mostRecentCompilationHash !== __webpack_hash__
}

function handleAvailableHash(data){
    mostRecentCompilationHash = data
}

function handleSuccess() {
    var isHotUpdate     = !isFirstCompilation
    isFirstCompilation  = false

    if (isHotUpdate) { handleUpdates() }
}

function handleUpdates() {
    if (!isUpdateAvailable()) return
    console.log('%c Reloading Extension', 'color: #FF00FF')
    chrome.runtime.reload()
}

当您准备好使用它时(仅在开发期间),您只需将其添加到您的 background.js 入口点即可

module.exports = {
    entry: {
        background: [
            path.resolve(__dirname, 'reloader.js'), 
            path.resolve(__dirname, 'background.js')
        ]
    }
}


For actually hooking into the event emitter as was originally asked you can just require it from webpack/hot/emitter since that file exports an instance of the EventEmitter that's used.
if(module.hot) {
    var lastHash

    var upToDate = function upToDate() {
        return lastHash.indexOf(__webpack_hash__) >= 0
    }

    var clientEmitter = require('webpack/hot/emitter')

    clientEmitter.on('webpackHotUpdate', function(currentHash) {
        lastHash = currentHash
        if(upToDate()) return

        console.log('%c Reloading Extension', 'color: #FF00FF')
        chrome.runtime.reload()
    })
}

这只是直接来自源代码的精简版本:

https://github.com/webpack/webpack/blob/master/hot/dev-server.js https://github.com/webpack/webpack/blob/master/hot/dev-server.js

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

使用 webpack-dev-server 监听客户端的热更新事件? 的相关文章

随机推荐

  • Django:员工装饰者

    我正在尝试为 Django 编写一个 仅限员工 的装饰器 但我似乎无法让它工作 def staff only error Only staff may view this page def dec view func def view re
  • 两个复杂度 O((2n + 1)!) 和 O(n!) 相等吗?

    这可能是一个幼稚的问题 但我对 Big O 表示法和复杂性的概念很陌生 无法找到任何答案 我正在处理一个算法 2n 1 次检查条件 我可以说问题的复杂度是 O n 还是复杂度是 O 2n 1 Use 斯特林近似 http en wikipe
  • JAVA中存储二维数组的数据结构

    我正在寻找一种数据结构来存储二维整数数组 List 是正确的数据结构还是我应该使用另一种数据结构 有人可以给我一个关于如何创建这样的数据结构以及如何添加二维数组的简短示例吗 编辑 我想要一个数据结构 在其中存储 int 11 7 数组 例如
  • MySQL 中 BLOB 到长文本的转换

    我在 MySQL 中有一个数据类型为 BLOB 的列 我正在使用 Crystal Reports 来生成一些报告 我的问题是 BLOB 列如果包含图片以外的数据 将显示空白数据 我从数据库获取的数据只是文本 所以我想将 BLOB 列转换为其
  • 无法从设备存储中删除文件android

    我正在开发一个笔记应用程序 其中列表视图在将笔记存储在由我的实用程序类控制的内部存储中后显示笔记 我刚刚在上下文菜单中实现了删除选项 删除选项可以很好地删除每个选定的列表视图项目 但是 当我刷新列表活动或添加新注释时 已删除的注释不断重新出
  • 一旦我将项目添加到 XCode 4.0.2,它就会崩溃

    它给出了这个错误 ASSERTION FAILURE in SourceCache IDEXcode3ProjectSupport IDEXcode3ProjectSupport 269 Xcode3Sources XcodeIDE Fra
  • 如何使用 jszip 库压缩文件

    我正在开发一个使用 HTML5 和 jquery 的移动离线应用程序 我想使用 jszip 从本地存储备份文件 下面是我所做的代码片段 if localStorageKeys length gt 0 for var i 0 i lt loc
  • android:覆盖来电屏幕

    我想在来电屏幕上添加一些附加信息 为此 在我的应用程序中 我正在检查 PHONE STATE 并在 RINGING 上 我正在调用一项活动 在此活动中 我设置如下文本视图 它按预期工作 文本将添加到来电屏幕 问题是 如果我在我的应用程序中
  • 使用正则表达式和 re 获取括号之间的文本

    我有一个字符串数组 我想从中提取特定内容 link description button text 我想得到以下输出 link description button text 对于数组中的每个字符串 我执行以下操作 str re finda
  • Create-React-App:从 node_module 目录包含 CSS 的最佳方法是什么

    我正在尝试在我的 create react app 项目中包含一些 CSS CSS 来自第 3 方 NPM 包 因此位于 node modules 目录中 我试过 import node modules packagename css st
  • 尽管超时很长,PHP 仍丢失 mongoDB 游标

    我正在运行一个长 mongoDB 查询 如下所示 foreach xyz gt find gt timeout 24 60 60 1000 gt maxTimeMS 24 60 60 1000 as document 但是 尽管客户端和服务
  • 更改单选按钮旁边的文本字体?

    要更改我使用的 textView 的字体 TextView tv TextView findViewById R id textview Typeface font Typeface createFromAsset getAssets SF
  • #selector' 指的是未暴露给 Objective-C swift 3 的方法

    我正在使用 Xcode 8 和 swift 3 我在 let action 行上出现以下错误 selector 指的是不暴露给Objective C的方法有什么建议吗 override func tableView tableView UI
  • 传递结构体和结构体指针有什么区别,它们不都是指针吗?

    例如 var myStructRef Vertex var myStruct Vertex myStructRef Vertex 2 3 myStruct Vertex 2 3 fmt Println myStructRef fmt Pri
  • 如何使 Tkinter 支持 PNG 透明度?

    我在 Tkinter 中放入了部分透明的 PNG 图像 我得到的就是这个 如何让右边的黑三角变清晰 就像应该的那样 顺便说一句 这是 Windows 7 上的 python 2 6 这是一个示例 PNG 文件 example png 在不同
  • 如何保持多个虚拟树视图节点的检查状态同步?

    我的树有 2 层节点 它是联系人列表风格树 我的问题是 我想检查所有 联系人类别 中的每个联系人 这是我的联系人列表现在的屏幕截图 是的 我有权发布它 如你所见 托德 赫希已在类别中选中测试类别 但不在所有联系人 我想要实现的目标是让联系人
  • Reflection.Emit 抛出 BadImageFormatException

    我试图在运行时生成一个新的类 对象 看完之后如何使用 PropertyBuilder 创建私有属性 https stackoverflow com questions 33674541 how to create a private pro
  • azure 函数的身份验证令牌缓存

    我们使用身份服务器为我们使用的第三方服务颁发令牌 每个令牌的 TTL 为 1 小时 想知道从天蓝色函数使用此令牌时缓存此令牌的最佳实践是什么 我知道该函数应该是无状态的 但在每个函数运行中请求新令牌是没有意义的 谢谢 这里有一些选项 按努力
  • Nodejs Connect/Express 会话如何管理内存

    我一直在阅读一些关于 Connect 和 Express 的源代码 了解如何管理会话 我仍在学习会话的基础知识 但我不明白内存是如何处理的 我知道服务器将会话数据保存在内存中并使用会话 ID 来访问数据 服务器发送保存 id 的 cooki
  • 使用 webpack-dev-server 监听客户端的热更新事件?

    这是一个有点边缘的情况 但了解一下会很有帮助 当使用 webpack dev server 开发扩展以使扩展代码保持最新时 监听 webpackHotUpdate 会很有用 带有内容脚本的 Chrome 扩展通常有两个方面 背景 注入的内容