上一篇文章介绍了serviceWorker是什么以及如何在项目中使用serviceWorker,这一篇着重分析ngsw-worker.js的结构,具体的缓存策略是如何实现的。

 一切要从一个中介者开始。ngsw-worker定义了一个Driver,负责worker的初始化,版本更新管理,事件的监听和任务调度。

 源头是一个driver

class Driver{constructor(scope, adapter, db) {this.scope = scope; // 作用域this.adapter = adapter; //网络事件适配器this.db = db;   // 缓存db//如果drive在初始化的时候,或者其他时候发生了错误,比如说获取不到需要的资源,则会进入safe_mode状态,此时不对数据缓存做多余处理。初始为normal状态this.state = DriverReadyState.NORMAL;this.stateMessage = '(nominal)';//尚未初始化this.initialized = null;  //版本管理,如果有新的config,或者静态资源数据有改变,则会生成一个新的version。之后的缓存和数据则以新version为准this.clientVersionMap = new Map();this.versions = new Map();this.latestHash = null;this.lastUpdateCheck = null;this.scheduledNavUpdateCheck = false;// 开启一个任务调度器,在空闲的时候调度各种任务。this.idle = new IdleScheduler(this.adapter, IDLE_THRESHOLD, this.debugger);}
}

 接下来driver定义了事件监听,主要对应service-worker的生命周期,以及关键的网络请求事件和push事件管理。

this.scope.addEventListener('install', (event) => {// 由于sw的更新和app本身的更新没有太大的关联,所以在install阶段直接越过app自身的检查更新,直接去更新sw自己的versionevent.waitUntil(this.scope.skipWaiting());});// 当新版本的sw第一次激活的时候,触发该事件this.scope.addEventListener('activate', (event) => {// 由于有新版本了,所以先越过旧版本。event.waitUntil(this.scope.clients.claim());if (this.scope.registration.active !== null) {this.scope.registration.active.postMessage({ action: 'INITIALIZE' });}});// 处理fetch,message和push事件this.scope.addEventListener('fetch', (event) => this.onFetch(event));this.scope.addEventListener('message', (event) => this.onMessage(event));this.scope.addEventListener('push', (event) => this.onPush(event));

 这里值得注意的是,sw在激活的时候,通过一个postmessage进行schedule的的初始化。选取这个时机,而不是在第一次fetch data的时候进行初始化是因为。第一次fetch事件可能发生在下一次application load的时候。因此在active的这个时机去触发是合适的。但是如果在这个时候进行初始化,那么watiUntil可能会block掉fetch事件,因此这里巧妙的给自己发送一个postmessage事件,在下一个task里面再执行初始化。

一切都要等initialize之后才生效

initialize做的事情很简单。首先读indexDB,找最近的config获取config数据——》从网络拉取新的config.json,对比需不需要更新数据。如果第一步读取数据库失败了,则表示是第一次访问网站,或者db被wipe了。那么sw回去获取新的manifestconfig,生成一个hash,将其保存在db里面。在获取到需要的manifestconfig之后,sw自己会将数据存储在一个AppVersion对象中,以供后续使用。如下所示:

 try {// 读取数据库[manifests, assignments, latest] = await Promise.all([table.read('manifests'),table.read('assignments'),table.read('latest'),]);// 如果读取到了,那么给idle发送一个任务,请求checkupdatethis.idle.schedule('init post-load (update, cleanup)', async () => {await this.checkForUpdate();try {await this.cleanupCaches();}catch (err) {// Nothing to do - cleanup failed. Just log it.this.debugger.log(err, 'cleanupCaches @ init post-load');}});}catch (_) {// 如果糟了,那么从新创建一个manifest版本,创建新的hash,存在数据库里面。const manifest = await this.fetchLatestManifest();const hash = hashManifest(manifest);manifests = {};manifests[hash] = manifest;assignments = {};latest = { latest: hash };// Save the initial state to the DB.await Promise.all([table.write('manifests', manifests),table.write('assignments', assignments),table.write('latest', latest),]);}

  无论从那里得到数据,在这里已经得到最新的数据了,然后将其按照hash,存到appVersion map里面。由于config里面保存的新的静态资源,会在schedule中插入一个任务,通知assetGroups进行update。

//Driverawait Promise.all(Object.keys(manifests).map(async (hash) => {try {//尝试初始化最新的这个version。如果失败,则整个initialize失败await this.scheduleInitialization(this.versions.get(hash), this.latestHash === hash);}catch (err) {this.debugger.log(err, `initialize: schedule init of ${hash}`);return false;}})); 
// AppVersionasync initializeFully(updateFrom) {try {//依次排排坐等着每一个group updateawait this.assetGroups.reduce(async (previous, group) => {// 同步执行,线性关系,如果前面有失败的,则整个流程失败。await previous;// Initialize this group.return group.initializeFully(updateFrom);}, Promise.resolve());}catch (err) {this._okay = false;throw err;}}

等待assetsGroup更新完毕之后,可以认为初始化工作已完成。

当有网络请求的时候会做什么?

ngsw-worker.js hook住了所有的网络请求,当监听到有请求发生时,在请求发出去之前,调用onFetch进行相应的操作。可以看到onFetch先做一步粗略的过滤,将一些显性会失败的请求过滤掉,然后剩下的丢给handleFetch进行细分处理。

// onFetchconst req = event.request;if (this.adapter.parseUrl(req.url, this.scope.registration.scope).path === '/ngsw/state') {// debugger 可以handle一切网络请求,但是不会对sw的状态有任何影响event.respondWith(this.debugger.handleFetch(req));return;}// 如果当前sw处在unsafe的状态,那么直接将请求降级到网络上。在这里直接跳过,而不是使用responseWith,是因为后者会表明该请求被sw处理过。实际上并没有处理。if (this.state === DriverReadyState.SAFE_MODE) {// 通知idle schedule进行更新检查等操作。event.waitUntil(this.idle.trigger());return;}// 如果cache头为only-if-cached,而request mode不是same-origin,那么该请求一定会失败,所以这里记录以下错误原因,然后直接返回。if (req.cache === 'only-if-cached' && req.mode !== 'same-origin') {// Log the incident only the first time it happens, to avoid spamming the logs.if (!this.loggedInvalidOnlyIfCachedRequest) {this.loggedInvalidOnlyIfCachedRequest = true;this.debugger.log(`Ignoring invalid request: 'only-if-cached' can be set only with 'same-origin' mode`, `Driver.fetch(${req.url}, cache: ${req.cache}, mode: ${req.mode})`);}return;}//  经过handleFetch处理请求。event.respondWith(this.handleFetch(event));

  在handleFetch里面,如果在还没有初始化完成的时候,就受到了网络请求,handleFetch会先手动加初始化。然后获取当前appversion,用对应的appVersion中的handle策略来处理该请求。如果获取appversion失败,则降级到safeFetch。最后完成之后,通知idle执行后台操作。具体操作如下所示:

function handleFetch      // 如果还没有initialize,则先进行初始化if (this.initialized === null) {this.initialized = this.initialize();}try {// Wait for initialization.await this.initialized;}catch (e) {// 初始化失败,则进入safe_mode,所有的请求不做任何缓存,直接走网络。this.state = DriverReadyState.SAFE_MODE;this.stateMessage = `Initialization failed due to error: ${errorToString(e)}`;// 通知后台进行后台操作。event.waitUntil(this.idle.trigger());return this.safeFetch(event.request);}// 如果是navigation请求,需要先检查更新if (event.request.mode === 'navigate' && !this.scheduledNavUpdateCheck) {this.scheduledNavUpdateCheck = true;this.idle.schedule('check-updates-on-navigation', async () => {this.scheduledNavUpdateCheck = false;await this.checkForUpdate();});}// 获取对应的appversionconst appVersion = await this.assignVersion(event);if (appVersion === null) {event.waitUntil(this.idle.trigger());return this.safeFetch(event.request);}let res = null;try {// 先根据请求的类型,执行对应的缓存操作等,如果这个工作失败了,那么再降级到网络上res = await appVersion.handleFetch(event.request, event);}catch (err) {if (err.isCritical) {// Something went wrong with the activation of this version.await this.versionFailed(appVersion, err, this.latestHash === appVersion.manifestHash);event.waitUntil(this.idle.trigger());return this.safeFetch(event.request);}throw err;}// 如果失败了,则执行后台操作,并且通过网络执行请求。if (res === null) {event.waitUntil(this.idle.trigger());return this.safeFetch(event.request);}// 执行请求,把结果返回到上层。到这里,相应的缓存已经完成了event.waitUntil(this.idle.trigger());// The AppVersion returned a usable response, so return it.return res;

safeFetch是一个包装器。如果result.code 不为200,或者请求发生了错误,则构造一个假的504的请求,返回给上层。

实现文件缓存由AssetsGroup类完成。

AssetsGroup的核心内容为根据请求的内容,查看是否由缓存,如果已有缓存并且缓存可用,则返回给上层,否则通过网络获取数据,然后将结果保存在缓存里。核心方法是handleFetch方法,中心思想如下图所示:

  const url = this.getConfigUrl(req.url);//首先判断请求的url是不是config里面指定的url,或者符合pattern里面约定的需要缓存的正则规则if (this.config.urls.indexOf(url) !== -1 || this.patterns.some(pattern => pattern.test(url))) {// 打开缓存,检查该请求是否已经被缓存过,还是需要通过网络获取。const cache = await this.cache;const cachedResponse = await cache.match(req);if (cachedResponse !== undefined) {// 先判断下该请求是不是有hash,如果有,说明缓存是可以用的,直接返回。否则需要看看这个请求是多久之前发生的,缓存是不是还可以用。if (this.hashes.has(url)) {return cachedResponse;}else {if (await this.needToRevalidate(req, cachedResponse)) {this.idle.schedule(`revalidate(${this.prefix}, ${this.config.name}): ${req.url}`, async () => { await this.fetchAndCacheOnce(req); });}// In either case (revalidation or not), the cached response must be good.return cachedResponse;}}// 没有可用的缓存,通过网络获取,并将结果保存在缓存里面。const res = await this.fetchAndCacheOnce(this.adapter.newRequest(req.url));// 需要将结果clone一下,因为结果可能要供多个请求使用。return res.clone();}else {return null;}

这里需要注意的是有缓存,但是没有hash的情况。说明这个缓存是由http cache header决定的。需要通过needToRevalidate来判断该请求/相应是否需要更新。有三种策略需要考虑

  1. 如果请求包括cache-control头部,则需要check请求的age,
  2. 如果请求有expires 头,则需要查看timestamp
  3. 如果没有任何跟缓存相关的头,那么是不可用的,直接返回true。

如果缓存不可用,都通过fetchAndCacheOnce来处理。

// inFlightRequest 里面存的是需要经过网络获取,已经通过网络请求,但是结果还没有回来的请求们。首先需要check现在要发出的请求是不是这一类,如果是的话,不应该再重复发送请求,直接等待上一个的返回结果。if (this.inFlightRequests.has(req.url)) {return this.inFlightRequests.get(req.url);}// 没有针对该请求的缓存操作正在执行,从这里开始出来,从网络获取并处理。const fetchOp = this.fetchFromNetwork(req);// 要先把请求放到inFlightRequest里面,表示该url的请求由此处理。this.inFlightRequests.set(req.url, fetchOp);try {// 等待网络结果const res = await fetchOp;// 需要确保只有正确返回的结果才会被缓存起来,否则不对的结果会block掉应用if (!res.ok) {throw new Error(`Response not Ok (fetchAndCacheOnce): request for ${req.url} returned response ${res.status} ${res.statusText}`);}// 正确的结果,放到缓存里面const cache = await this.scope.caches.open(`${this.prefix}:${this.config.name}:cache`);await cache.put(req, res.clone());// 如果该请求还没有hash,则更新它的hash值if (!this.hashes.has(req.url)) {// Metadata is tracked for requests that are unhashed.const meta = { ts: this.adapter.time, used };const metaTable = await this.metadata;await metaTable.write(req.url, meta);}return res;}finally {// 无论结果是否被正确返回,都将该请求从inFlightRequest里面删掉。表示这一次网络获取结束。this.inFlightRequests.delete(req.url);}

DataGroup呢?

DataGroup的思想跟AssetGroup差不多,区别在于Datagroup是针对的是网络上的请求,所以缓存的数据会很多。如果都无脑的放在cache里面,cache可能会哭出来。所以针对这种请求,DataGroup采用LRU策略进行处理。具体情况懒得写了。。下次再见。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. node-sass 安装报错时尝试

    npm install node-sass --unsafe-permtrue --allow-root...

    2024/5/1 21:51:01
  2. angularjs 中a标签中href属性带有unsafe:javascript解决方案

    var firstApp angular.module(firstApp, []); firstApp.config([$compileProvider,function ($compileProvider) {$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|file|sms|javascript):/);//此处是正则表达式 }]);...

    2024/5/1 21:59:21
  3. 双眼皮全切术后即刻

    ...

    2024/5/2 3:39:49
  4. angular 动态设置blob链接给 ng-href时遇到unsafe 解决方案

    2019独角兽企业重金招聘Python工程师标准>>> angular 默认情况下 的安全协议 是 https?|ftp|mailto| 当我们使用blob 对象去产生url时,需要设定blob为安全协议var app angular.module( myApp, [] ).config( [$compileProvider,function( $compilePro…...

    2024/4/21 11:45:34
  5. 耽误你的十分钟,让MVVM原理还给你

    时间在嘀嗒嘀嗒的走着 既然来了就继续看看吧 这篇文章其实没有什么鸟用,只不过对于现在的前端面试而言,已经是一个被问烦了的考点了既然是考点,那么我就想简简单单的来给大家划一下重点 众所周知当下是MVVM盛行的时代,从早期的A…...

    2024/5/2 3:57:50
  6. MVVM双向绑定机制的原理和代码实现

    MVVM 一句话就是 vm层&#xff08;视图模型层&#xff09;通过接口从后台m层&#xff08;model层&#xff09;请求数据 vm层继而和v&#xff08;view层&#xff09;实现数据的双向绑定 数据绑定 单向绑定&#xff1a;数据 >视图 双向绑定&#xff1a;视图 <> 数据 …...

    2024/5/2 2:28:26
  7. 来来来,懂vue送mvvm原理

    从vue说起 vue相信大家都很熟悉&#xff0c;如何使用&#xff0c;本人就不在这里演示了&#xff0c;相信这个大家都比我熟&#xff0c;今天我们来说说vue的mvvm原理&#xff0c;比较代码简单实现。下面简单了解一下 Vue.js 关于双向绑定的一些实现细节&#xff1a; Vue.js 是采…...

    2024/4/21 11:45:33
  8. 不好意思!耽误你的十分钟,让MVVM原理还给你

    时间在嘀嗒嘀嗒的走着 既然来了就继续看看吧 这篇文章其实没有什么鸟用&#xff0c;只不过对于现在的前端面试而言&#xff0c;已经是一个被问烦了的考点了既然是考点&#xff0c;那么我就想简简单单的来给大家划一下重点 众所周知当下是MVVM盛行的时代&#xff0c;从早期的A…...

    2024/5/2 2:57:11
  9. 【前端学习】MVVM框架原理

    MVVM模式包含三个部分&#xff1a; M 代表模型&#xff0c;就是数据 V 代表视图&#xff0c;就是视图模板 VM 代表视图模型对象&#xff0c;链接模型与视图的 当模型中的数据发生改变&#xff0c;会同步给视图 是通过数据绑定实现的 当视图中的数据发生改变&#xff0c;会同步给…...

    2024/5/2 1:50:17
  10. 双眼皮去疤痕增生药膏

    ...

    2024/4/21 19:56:25
  11. 双眼皮前后对比美女

    ...

    2024/4/21 14:53:30
  12. compile函数与link函数用法

    compile函数与link函数用法 compile和link函数用法&#xff1f; compile函数的作用是对指令的模板进行转换&#xff1b;link作用是在模型和视图之间建立关联&#xff0c;包括在元素上注册事件监听&#xff1b;scope在link阶段才会被绑定到元素上&#xff0c;因此compile阶段操…...

    2024/4/21 13:13:35
  13. angular的$compile

    http://www.gsgundam.com/2014-12-13-angularjs-compile-to-show-dymanic-html-content/ 转载于:https://www.cnblogs.com/coding4/p/6530845.html...

    2024/4/21 14:32:50
  14. 双眼皮内折

    ...

    2024/4/21 5:07:56
  15. 双眼皮内有细纹

    ...

    2024/4/21 19:48:56
  16. 资源|最新WEB前端开发全套视频教程

    特别说明&#xff1a;资料来源于网络&#xff0c;版权归原作者所有&#xff0c;仅限用于学习交流之用&#xff0c;请勿做它用。如有不妥请联系小睿删除&#xff01; 引言 最近很多同学在群里问小睿有么有前端的课程呢&#xff1f;答案是必须的&#xff01;以下资料是我昨晚冒死…...

    2024/4/21 8:43:54
  17. 双眼皮埋线准备

    ...

    2024/4/21 14:52:16
  18. TypeScript日期工具: date-fns日期工具的使用方法

    安装1. isToday():判断所传入日期是否为今天2.isYesterday(): 判断是否为昨天3.isTomorrow()判断是否为明天. 用法与isToday(), isYesterday()用法相同,就不加以累述了.4.format(): 格式化日期函数5. addDays():获得第n天之后的日期;6.addHours(): 获得当前小时之后的小时(比如…...

    2024/4/21 21:50:47
  19. angular时间格式化

    html中使用 angular在格式化时间时不需要自己写方法,内置的管道可以直接使用 在组件中直接使用 {{date | date:yyyy-MM-dd HH:mm:ss}}在class中使用 引入 DatePipe import { DatePipe } from angular/common;注入 constructor中,constructor(private datePipe: DatePipe) {}…...

    2024/4/21 21:01:08
  20. 双眼皮埋线之后头疼怎么办

    ...

    2024/4/21 22:54:34

最新文章

  1. 直接下拉的镜像,怎么确定镜像里面dockerfile的执行指令

    如果您直接拉取了 Docker 镜像并且想要确定镜像中的执行指令&#xff0c;可以使用 docker image inspect 命令来查看镜像的详细信息&#xff0c;包括 CMD 和 ENTRYPOINT。 以下是查看 Docker 镜像中执行指令的步骤&#xff1a; 1. 首先&#xff0c;确保您已经拉取了想要检查的 …...

    2024/5/2 5:09:05
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 蓝桥杯第十五届抱佛脚(十)贪心算法

    蓝桥杯第十五届抱佛脚&#xff08;十&#xff09;贪心算法 贪心算法基本概念 贪心算法是一种在算法设计中常用的方法&#xff0c;它在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是最好或最优的算法。 贪…...

    2024/5/2 2:39:45
  4. Nginx配置文件修改结合内网穿透实现公网访问多个本地web站点

    文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…...

    2024/5/1 13:14:34
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57