Vue 3.1.0 的 beta 版發布

大家好,我是若川(點這里加我微信?ruochuan12,長期交流學習)。昨晚尤大視頻號直播說到vue 3.1.0 beta版發布了,今天分享這篇文章。也有小伙伴可能注意到了昨晚我一直在送禮物。

點擊下方卡片關注我、加個星標,或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列


以往都是純翻譯發給大家,這次換個形式為大家介紹。

編輯 |?KnowsCount

? ? ? ? ?QC-L

本次 beta 版本帶來了一些有趣的新特性和錯誤修復。

新特性

  • onServerPrefetch:composition-api 版本的 serverPrefetch

  • 組件級別的 compilerOptions

  • @vue/compiler-core 支持了空白字符處理策略

  • 支持通過 app.config.compilerOptions 配置運行時的編譯器

  • devtools 改進了對 KeepAlive 的支持

  • 支持通過 is="vue:xxx" 將普通元素轉換為組件

onServerPrefetch

具體請參見 PR 3070[1] 和 PR 2902[2]

此特性主要解決在 composition-api 情況下沒有提供 serverPrefetch 生命周期鉤子函數的問題。

這個鉤子函數名為 onServerPrefetch

如果你也這方面的需求,可以嘗試升級至 3.1.0-beta

相關討論:

  • vue-apollo[3]

  • app-extension-apollo[4]

@vue/complier-core 支持了空白字符處理策略

具體內容請參閱 PR 1600[5] 和 v2 原有效果[6]

應用

我們來測試下此策略:

先裝個 beta 版本的 @vue/compiler-core

yarn?add?@vue/compiler-core@beta

新建 index.js 文件

const?core?=?require('@vue/compiler-core')const?{?baseCompile:?complie?}?=?coreconst?{?ast?}?=?complie(`??????foo?\n?bar?baz??????`,?{whitespace:?'preserve'?//?condense
})console.log(ast.children[0])
console.log(ast.children[0].content)

大概效果如示例所示:

<!--?源代碼?-->foo?\n?bar?baz?????<!--?whitespace:?'preserve'?-->foo?\n?bar?baz?????<!--?whitespace:?'condense'?-->foo?bar?baz?

源碼

原本只在 compiler-coreparse 文件中的 defaultParserOptions 提供了默認的 condense 情況

whitespace:?'condense'

compiler-core 的 options 文件中新增了 whitespace

whitespace?:?'preserve'?|?'condense'

相關鏈接:

  • PR 1600[7]

  • stackoverflow[8]

  • vue 2.0/compiler[9]

  • vue 2.0 的 `whitespace`[10]

  • vue 2.0 的 PR[11]

通過 is="vue:xxx" 支持普通元素的轉換

這條特性的更新,從源碼上看,兼容了兩種類型。

  1. 棄用的 v-is 指令

  2. is="vue:xxx" 的屬性

源碼


let?{?tag?}?=?node//?1.?動態組件
const?isExplicitDynamic?=?isComponentTag(tag)
const?isProp?=findProp(node,?'is')?||?(!isExplicitDynamic?&&?findDir(node,?'is'))
if?(isProp)?{if?(!isExplicitDynamic?&&?isProp.type?===?NodeTypes.ATTRIBUTE)?{//?<button?is="vue:xxx">//?如果不是?<component>,僅僅是?"vue:"?開頭//?在解析階段會被視為組件,并在此處進行//?tag?被重新賦值為?"vue:"?以后的內容tag?=?isProp.value!.content.slice(4)}?else?{const?exp?=isProp.type?===?NodeTypes.ATTRIBUTE??isProp.value?&&?createSimpleExpression(isProp.value.content,?true):?isProp.expif?(exp)?{return?createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT),?[exp])}}
}
//?當?tag?為?<component>,或者?is="vue:xxx",跳過后續處理
if?(name?===?'is'?&&(isComponentTag(tag)?||?(value?&&?value.content.startsWith('vue:')))
)?{continue
}
//?...

上述代碼中有幾個點:

  1. 首先 isComponentTag,用以判斷是否為動態組件:

//?此方法用于判斷是否為動態組件
function?isComponentTag(tag:?string)?{return?tag[0].toLowerCase()?+?tag.slice(1)?===?'component'
}
  1. 查找是否含有 is 屬性

//?先查屬性
findProp(node,?'is')
//?否則判斷是不是動態組件,如果不是,判斷是不是指令
!isExplicitDynamic?&&?findDir(node,?'is')

其主要原因是,兩者的 AST 結構不同。

相關鏈接:

  • Support casting plain element[12]

  • Custom Elements Interop[13]

附上 ChangeLog

Bug 修復

  • 兼容: 處理并針對 config.optionMergeStrategies 實現告警 (94e69fd[14])

  • compiler-core: 當注釋選項啟用時,在生產環境下將保留注釋 (e486254[15])

  • hmr: 禁止從組件類型中移除 __file 的 key 值 (9db3cbb[16])

  • hydration: 修復 asnyc 組件 hydrated 前的更新 (#3563[17]) (c8d9683[18]), closes #3560[19]

  • reactivity: 修復 readonly + reactive Map 的追溯 (#3604[20]) (5036c51[21]), closes #3602[22]

  • runtime-core: 確保聲明 props 的 key 永遠存在 (4fe4de0[23]), closes #3288[24]

  • runtime-core:?computed 監聽多個 source?(#3066[25]) (e7300eb[26]), closes #3068[27]

  • Teleport: 避免改變對 vnode.dynamicChildren 的引用 (#3642[28]) (43f7815[29]), closes #3641[30]

  • watch: 避免遍歷 non-plain 對象 (62b8f4a[31])

  • watch: this.$watch 應該支持監聽鍵路徑 (870f2a7[32])

特性

  • onServerPrefetch (#3070[33]) (349eb0f[34])

  • 運行時編譯器支持了組件級 compilerOptions (ce0bbe0[35])

  • compiler-core: whitespace 處理策略 (dee3d6a[36])

  • config: 利用 app.config.compilerOptions 支持配置運行時編譯器 (091e6d6[37])

  • devtools: 升級對 KeepAlive 的支持 (03ae300[38])

  • 支持利用 is="vue:xxx" 將 plain 元素 cast 到組件 (af9e699[39])

性能提升

  • 僅當實際改變時才會觸發 $attrs 的更新 (5566d39[40])

  • compiler: 解析結束標簽時跳過不必要的檢查 (048ac29[41])

參考資料

[1]

PR 3070: https://github.com/vuejs/vue-next/pull/3070

[2]

PR 2902: https://github.com/vuejs/vue-next/pull/2902

[3]

vue-apollo: https://github.com/vuejs/vue-apollo/issues/1102

[4]

其余參考資料省略,可以點擊閱讀原文查看。


最近組建了一個江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你進群。


·················?若川出品?·················

今日話題

昨晚尤大在視頻號直播,估計挺多人看到直播了。估計看到直播的還是小部分,大部分還是不知道有這個直播。我一直在刷禮物,也是第一次看視頻號刷禮物,我也不太懂視頻號的玩法。后來才發現可以鏈接到視頻號,還可以關聯公眾號,說不定還能漲幾個粉。但我用的是第二個號沒有視頻號關聯。平時知道有這個東西,但真正用起來又顯得有點棘手。歡迎在下方留言~? 歡迎分享、收藏、點贊、在看我的公眾號文章~

一個愿景是幫助5年內前端人走向前列的公眾號

可加我個人微信?ruochuan12,長期交流學習

推薦閱讀

我在阿里招前端,我該怎么幫你?(現在還能加我進模擬面試群)

若川知乎問答:2年前端經驗,做的項目沒什么技術含量,怎么辦?
據說 99% 的人不知道 vue-devtools 還能直接打開對應組件文件?本文原理揭秘

點擊方卡片關注我、加個星標,或者查看源碼等系列文章。
學習源碼整體架構系列、年度總結、JS基礎系列

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式練習_設計練習是邪惡的

設計模式練習It was the final round of interviews. Or, so the candidate thought.這是采訪的最后一輪。 或者&#xff0c;所以候選人認為。 She’d spent all day interviewing in our office. As the final interviewer, I walked her out the building. She seemed confi…

morningcat2018 LearningDocs

2019獨角獸企業重金招聘Python工程師標準>>> LearningDocs 學習資料與文檔 JCP&#xff08;Java Community Process &#xff0c;Java社區進程 &#xff09; https://www.jcp.org/en/home/index JSR&#xff08;Java Specification Requests&#xff0c;Java規范請求…

firefox下可惡的value

前幾天做項目 遇到這樣一個情況 document.getElementById("txtTest").value "111"; 這條語句在ff下和ie下都是好用的 但是用開發工具看html代碼 ie下顯示正常 ff下顯示的卻是修改之前的(實際上已經修改了&#xff0c;只是html沒有修改過來) 用js修改input…

據說 99% 的人不知道 vue-devtools 還能直接打開對應組件文件?本文原理揭秘

1. 前言你好&#xff0c;我是若川[1]&#xff0c;微信搜索「若川視野」關注我&#xff0c;專注前端技術分享&#xff0c;一個愿景是幫助5年內前端開闊視野走向前列的公眾號。歡迎加我微信ruochuan12&#xff0c;長期交流學習。這是學習源碼整體架構系列 之 launch-editor 源碼&…

mysql 存儲 事務_MYSQL 可以在存儲過程里實現事務控制嗎

展開全部6.7 MySQL 事務與鎖定命令6.7.1 BEGIN/COMMIT/ROLLBACK 句法缺省的&#xff0c;MySQL 運行在 autocommit 模式。這就意味著&#xff0c;當你執行完一e69da5e887aa62616964757a686964616f31333361326265個更新時&#xff0c;MySQL 將立刻將更新存儲到磁盤上。如果你使用…

如何忽略證書繼續訪問_前5個最容易被忽視的可訪問性問題

如何忽略證書繼續訪問Accessibility is quickly becoming one of the most important aspects of the way we use the web, if not the most important. Just between 2017 and 2018, the number of federal court cases regarding web accessibility nearly tripled, signifyi…

《認清C++語言》のrandom_shuffle()和transform()算法

1&#xff09;STL中的函數random_shuffle()用來對一個元素序列進行重新排序&#xff08;隨機的&#xff09;&#xff0c;函數原型如下&#xff1a; template<class RandomAccessIterator> void random_shuffle( RandomAccessIterator _First, //指向序列首元素的迭代器 R…

作為前端開發,如何高效學習 TypeScript

大家好&#xff0c;我是若川。有朋友跟我說最近面試前端候選人&#xff0c;問到關于 JavaScript 的一些少見誤區問題&#xff0c;候選人很多都沒回答上來&#xff0c;他很詫異&#xff0c;一個從國際大廠出來的面試者&#xff0c;竟然對 JavaScript 的一些誤區問題都不了解。他…

figma下載_對于這10家公司,Figma是邁向新高度的起點

figma下載Hey everyone! In this post, we are highlighting 10 companies for which the use of Figma has become the starting point on the path to new heights. These are the use cases of problems and their solutions, where Figma played a decisive role.嘿大家&am…

mysql查詢條件為or_使用mysql查詢where條件里的or和and

為什么要著重講這塊內容呢?因為好多小伙伴都會混淆&#xff0c;要不就是不知道怎么組合使用&#xff0c;今天就給大家講這部分內容干貨&#xff0c;讓大家半分鐘看懂。AND、OR運算符的組合使用在WHERE子句中&#xff0c;通過AND、OR運算符可以同時連接多個條件&#xff0c;當然…

sql server(常用)

普通用法 //生成 uuid 并轉為小寫 select LOWER(SUBSTRING(uuid,1,8)-SUBSTRING(uuid,10,4)-SUBSTRING(uuid,15,4)-SUBSTRING(uuid,20,4)-SUBSTRING(uuid,25,12)) from (select cast(NEWID() as varchar(36)) as uuid) s //ea52a7bb-a2aa-44b8-be28-5ebc64defcf9//獲取時分秒…

代碼編寫中會遇到的安全性問題

一、常用的攻擊手段 1&#xff0e;腳本注入 漏洞描述&#xff1a; 腳本注入攻擊在通過瀏覽器使用用戶輸入框插入惡意標記或腳本代碼時發生。 如&#xff1a;某個輸入框允許用戶向數據存儲中插入內容&#xff0c;如果將一段js腳本插入其中&#xff0c;則當其他用戶使用或瀏覽此數…

TypeScript 原來可以這么香?!

先問一個問題&#xff0c;JavaScript有幾種數據類型&#xff1f;number、string、boolean、null、undefined、symbol、bigint、object其中 bigint 是 ES2020 新增的數據類型&#xff0c;而早在 TS3.2 時便成為 TS 的標準&#xff0c;其實還有好多 ES 標準是 TS 率先提出的&…

java8新特性stream深入解析

2019獨角獸企業重金招聘Python工程師標準>>> 繼續java8源碼的發燒熱&#xff0c;越看越是有充實的感覺。 數據時代下的產物 Java順應時代的發展推出的高效處理大量數據能力的api&#xff0c;它專注于對集合對象進行各種非常便利、高效的聚合操作&#xff0c;借助于同…

mysql內連接的自連接_mysql 內連接、外連接、自連接

一)內連接(等值連接)&#xff1a;查詢客戶姓名&#xff0c;訂單編號&#xff0c;訂單價格---------------------------------------------------select c.name,o.isbn,o.pricefrom customers c inner join orders owhere c.id o.customers_id;-------------------------------…

關于ASP.NET MVC

我是否要學習一下ASP.NET MVC呢&#xff1f;因爲從它剛發布的時候就已經初步的學習了一下&#xff0c;可是一直沒有堅持下來。不過心里對于這份惦記&#xff0c;又讓我始終放不下&#xff0c;看來應該抽個時間來系統的學習一下。 就這樣吧&#xff0c;把自己的博客當成微博來使…

版式設計與創意 pdf_戀愛與版式

版式設計與創意 pdfSince its beginnings, Libe?ration has been characterized by a very distinctive use of typeface, to such an extent that Libe? has put its mark on fonts from across different eras, appropriating these in a certain way.小號因斯它的起點&…

移動網站開發——標記語言

移動互聯網被稱為“第五次科技革命”&#xff0c;而隨著iPhone和Android等智能手機的日漸流行和iPad等平板電腦的出現&#xff0c;移動互聯網的潛力和趨勢也愈發顯現&#xff0c;針對移動設備的網站開發越來越受到關注&#xff0c;國內很多公司也開始重視面向所有移動設備的網站…

mysql適配器_MySQL適配器PyMySQL詳解

import pymysqlimport datainfoimport time#獲取參數host datainfo.hostusername datainfo.usernamepassword datainfo.passworddatabase datainfo.dbprint()#測試數據庫連接def testconnect():#打開數據庫鏈接db pymysql.connect(host,username,password,database)#使用c…

獲取當前Tomcat實例的端口

有時需要在當前代碼中獲取當前Server實例的端口號, 通過HttpServletRequest請求可以, 但有時也需要在沒有請求的情況下獲取到端口號. 用以下方法是可以獲取到的: public int getHttpPort() {try {MBeanServer server;if (MBeanServerFactory.findMBeanServer(null).size() >…