babel改變es6解構賦值

概述

大家都知道ES6的解構,有時也會在解構的時候進行賦值默認值。

不過不知道大家是不是注意到,有時候的賦值是不生效的。

看個例子:

const user = {name: 'xiaohesong', age: null, sex: ''}
const {name, age = 18, sex = 'man', gf = 'lzl'} = user
console.log(name, age, sex, gf) 

大家都知道上面由於規範的原因會輸出什麼內容。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

然而大多數的時候,其實更想對falsly的值進行賦值。

也就是想要他的行爲變成下面這樣:

const user = {name: 'xiaohesong', age: null, sex: ''}
const {name, age = 18, sex = 'man', gf = 'lzl'} = user
console.log(name, age, sex, gf) // xiaohesong 18 man lzl

很早之前就有這個想法,不過沒有去嘗試。

起因

hao

由於前段時間看dan寫了發了個推說關於匿名導出的:

https://twitter.com/dan_abramov/status/1255229440860262400

If you write “export default () => { … }” to declare components, they:

  • will show up as Anonymous in stack traces
  • will show up as Unknown in DevTools
  • won’t be checked by React-specific lint rules
  • won’t work with some features like Fast Refresh

Give components names!

所以就想着給項目中的匿名導出移除,考慮到可能有不少的模塊,就尋思着寫個插件給對應的ExportDefaultDeclaration ast節點替換下當做練手。

不過最終沒有帶到線上,不是很有必要,項目用到的匿名導出不是很多,最主要的還是慫,出一個故障可不好玩。。

對應的匿名導出變更的插件地址:babel-plugin-assign-name-for-anonymous-default

基於這個插件的輸出,對於解構賦值默認值產生了想法。因爲在項目中有不少的解構賦值默認值是達不到預期的,有些字段後端會返回成null等。

開動

對於babel的ast就不過多的介紹了,網上也有很多的文章。

由於明確了我們的目標,只需要找到對應的節點就可以了。

https://astexplorer.net/ 這裏可以找到對應的節點:

const fields = ['first', '']
const [firstField, secondField = 'second'] = fields

這裏主要的節點就是ArrayPattern

const {name = 'asd'} = {name: '', age: 18, friend: {fName: ''}}

這裏主要的節點就是ObjectPattern

如果有賦默認值的行爲,這兩個下面都有一個AssignmentPattern

在這個ast裏可以模擬出你想到的行爲(ast打開,js默認選中的就是acorn解析器),然後配合babel-types來對節點進行操作。

其實babel知道了基本的行爲再配合ast和types就能做到你想做的操作。

https://github.com/jamiebuilds/babel-handbook 這個作爲入門很好的資料。

主要的操作就是在AssignmentPattern這一步,有興趣可以看下源碼。

當時是想給babel提個pr加個options,但是考慮到違背規範,會產生副作用,便放棄了這個想法。

解構賦默認值的時候會對falsly的值進行處理,效果類似於||操作符。

和團隊商討之後,同事認爲沒什麼必要,需要處理的時候自己處理下就好,因此開源出來。

插件地址: babel-plugin-use-or-operator-for-destructuring-default-value

不求大家在項目中用到,但求各位大佬的個人項目中使用下試試。在下不勝感激。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章