教你巧用 import.meta 实现热更新的问题

目录
  • import.meta
  • 应用场景
  • URL()
  • 二者结合使用

import.meta

import.meta 是一个给 JavaScript 模块暴露特定上下文的元数据属性的对象,它包含了这个模块的信息。

import.meta 对象是由 ECMAScript 实现的,它带有一个 null 的原型对象。这个对象可以扩展,并且它的属性都是可写,可配置和可枚举的。

<script type="module">
	console.log(import.meta)  // {url: 'http://127.0.0.1:5500/dist/index.html?a=1'}
</script>

它返回一个带有 url 属性的对象,指明模块的基本 URL。也可以是外部脚本的 URL,还可以是内联脚本所属文档的 URL。注意,url 也可能包含参数或者哈希(比如后缀?#

应用场景

import.meta.hot

Pinia 是 vuex 新替代方案。Pinia 中热更新实现,借助 import.meta

import { defineStore, acceptHMRUpdate } from 'pinia'

const useAuth = defineStore('auth', {
  // options...
})

// make sure to pass the right store definition, `useAuth` in this case.
if (import.meta.hot) {
  import.meta.hot.accept(acceptHMRUpdate(useAuth, import.meta.hot))
}

Vite 通过特殊的 import.meta.hot 对象暴露手动 HMR API。

https://github.com/vitejs/vite/blob/main/packages/vite/src/client/client.ts#L412

interface ImportMeta {
  readonly hot?: {
    readonly data: any

    accept(): void
    accept(cb: (mod: any) => void): void
    accept(dep: string, cb: (mod: any) => void): void
    accept(deps: string[], cb: (mods: any[]) => void): void

    prune(cb: () => void): void
    dispose(cb: (data: any) => void): void
    decline(): void
    invalidate(): void

    on(event: string, cb: (...args: any[]) => void): void
  }
}

vite HMR API:https://cn.vitejs.dev/guide/api-hmr.html

import.meta.webpackHot

module.hot 的一个别名,strict ESM 中可以使用 import.meta.webpackHot 但是不能使用 module.hot

在 package.json 中设置 "type": "module" 会强制 package.json 下的所有文件使用 ECMAScript 模块

vuex 借助 webpack 模块热替换:https://webpack.docschina.org/guides/hot-module-replacement/
vuex 提供 hotUpdate 方法:https://github.com/vuejs/vuex/blob/HEAD/src/store.js#L242-L243

if (import.meta.webpackHot) {
  // 使 action 和 mutation 成为可热重载模块
  import.meta.webpackHot.accept(['./mutations', './modules'], () => {
    // 获取更新后的模块
    // 因为 babel 6 的模块编译格式问题,这里需要加上 `.default`
    const newMutations = require('./mutations').default
    const newModules = require('./modules').default
    // 加载新模块
    store.hotUpdate({
      mutations: newMutations,
      modules: {
        ...newModules
      }
    })
  })
}

URL()

URL() 构造函数返回一个新创建的 URL 对象,表示由一组参数定义的 URL。

const url = new URL(url [, base])
  • url 是一个表示绝对或相对 URL 的 DOMString。如果url 是相对 URL,则会将 base 用作基准 URL。如果 url 是绝对URL,则无论参数base是否存在,都将被忽略。
  • base 可选。是一个表示基准 URL 的 DOMString,在 url 是相对 URL 时,它才会起效。如果未指定,则默认为 ''

二者结合使用

new URL('./relative-path', import.meta.url)

示例:获取图片

function loadImg (relativePath) {
  const url = new URL(relativePath, import.meta.url)
  const image = new Image()
  image.src = url
  return image
}
loadImg('../../images/1.jpg')

无需关心路径问题,自动根据当前 URL 进行转换。

到此这篇关于巧用 import.meta 实现热更新的文章就介绍到这了,更多相关import.meta热更新内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈tf.train.Saver()与tf.train.import_meta_graph的要点

    (一).tf.train.Saver() (1). tf.train.Saver() 是用来保存tensorflow训练模型的,默认保存全部参数 (2). 用来加载参数,注:只加载存储在data中的权重和偏置项等需要训练的参数,其他一律不加载,包括meta文件中的图也不加载 (二).tf.train.import_meta_graph (1). 用来加载meta文件中的图,以及图上定义的结点参数包括权重偏置项等需要训练的参数,也包括训练过程生成的中间参数,所有参数都是通过graph调用接口get

  • 教你巧用 import.meta 实现热更新的问题

    目录 import.meta 应用场景 URL() 二者结合使用 import.meta import.meta 是一个给 JavaScript 模块暴露特定上下文的元数据属性的对象,它包含了这个模块的信息. import.meta 对象是由 ECMAScript 实现的,它带有一个 null 的原型对象.这个对象可以扩展,并且它的属性都是可写,可配置和可枚举的. <script type="module"> console.log(import.meta) // {url

  • 教你巧用mysql位运算解决多选值存储的问题

    目录 一.问题场景 二. 场景分析 1.多字段存储 2.单字段拼接 三.巧用位运算 1.概述 2.sql查询 3.Java解析与计算 4.总结 附MySQL的支持6种位运算 总结 一.问题场景 工作中经常遇到多选值存储问题,例如:用户有多种认证方式,密码认证.短信认证.扫码认证等,一个用户可能只开启了其中某几种认证方式. 二. 场景分析 比较容易理解的两种实现方式,多字段存储.单个字段拼接存储. 1.多字段存储 每种认证方式用一个字段存储,0表示未开启,1表示已开启. 缺点:每增加一种认证方式都

  • vue3+vite中使用import.meta.glob的操作代码

    目录 前言: vue3中使用 import.meta.glob 具体方法: 前言: 在vue2的时候,我们一般引入多个js或者其他文件,一般使用  require.context 来引入多个不同的文件,但是vite中是不支持 require的,他推出了一个类似的功能,就是用import.meta.glob来引入多个,单个的文件. 这里说说他们的对比和区别: vue2 中使用  require 来引入多个不同的js文件 1.引入  modules 下的所有的js文件 const modulesFi

  • webpack实现热更新(实施同步刷新)

    本文介绍了webpack实现热更新(实施同步刷新),分享给大家,希望对大家有帮助. 解决方案一: 实现热更新,首先,安装一系列的node命令,如果嫌麻烦,你可以直接看解决方案二,相对来说比较简单. 1.webpack命令安装 npm install webpack -g npm init npm init -yes //可以创建默认的package.json npm install webpack --save-dev npm install path fs html-webpack-plugi

  • webpack自动打包和热更新的实现方法

    webpack常用配置 webpack dev server 功能:自动打包文件 配置dev server:在webpack.config.client.js中配置 const path = require('path'); const HTMlPlugin = require('html-webpack-plugin'); // 判断是否是开发环境 const isDev = process.env.NODE_ENV === 'development' const config = { ent

  • 详解Angular5/Angular6项目如何添加热更新(HMR)功能

    本文介绍了详解Angular5/Angular6项目如何添加热更新(HMR)功能,分享给大家,具体如下: A:什么是HMR? Q:HMR(热替换)用于在运行的应用程序中更新代码而不需要重建它.这将导致更快的更新和更少的全页重新加载. angular6-hmr 提供angular6以上HMR(热更新)功能 步骤 1.进入angular项目父级目录内 git clone https://github.com/staven630/angular6-hmr angular6-hmr目录与angular项

  • React Native 实现热更新并自动签名打包功能

    项目背景:手动link的安卓App 1.下载 react-native-code-push npm install --save react-native-code-push 2.在android/settings.gradle文件下新增: include ':app', ':react-native-code-push' project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../no

  • 使用arthas命令redefine实现Java热更新(推荐)

    arthas 是一个 Java 开源诊断神器. 今天分享一个非常重要的命令 redefine ,主要作用是加载外部的 .class 文件,用来替换 JVM 已经加载的类,总结起来就是实现了 Java 的热更新. redefine 在一下几种情况中会失败:1.增加了 field :2.增加了 method :3.替换正在运行的方法. 前两个比较好理解,第三个意思就是这个方法必须结束之后才会被替换,如果有个方法开始运行之后就不会跳出,那么这个方法所在的类是无法被替换的,类似无限循环的方法. 中间提到

  • Python在游戏中的热更新实现

    目录 介绍: 原理: 1.标准import 2.reload函数 实现: 总结: 介绍: 热更新,就是在服务器不重启的的情况下,对游戏增加新的功能或者修复出现bug 的代码.游戏更新迭代速度快,催生了热更技术的需求,在我经历过的游戏项目中,无论是服务端还是客户端,版本的更新都是围绕着热更新,特别是现在游戏动辄几个G,每次让玩家下载完整的包不现实,随意游戏必须要支持热更.下面来谈一下客户端Python热更新的处理. 原理: 1.标准import 都知道Python提供了import可以导入一个标准

  • Vue Vite热更新不起作用的正确解决办法

    目录 解决方案: 正确示例: 错误示例: 注意: 附:vue3+vite不热更新的解决方案 总结 解决方案: 提示:文件夹名称严格注意大小写 router 路由中名称 和文件夹(目录), 文件名需要保证大小写一致 正确示例: { path: 'show', component: () => import("@/views/show/index.vue"), } show 目录名index.vue 文件名这样大小写都是与路由中一致的就不会出现问题 错误示例: { path: 'sh

随机推荐