Menggunakan Redux di Ekstensi Chrome MV3

Catatan Terjemahan : Artikel asli ditulis sebelum MV3 dikenal. Namun demikian, ini sepenuhnya relevan untuk ekstensi MV3 (setidaknya untuk saat ini). Oleh karena itu, saya memutuskan untuk sedikit mengubah namanya, menambahkan penyebutan "MV3", yang tidak bertentangan sama sekali. Jika ada yang tidak tahu: MV3 - format / standar baru untuk ekstensi Chrome, akan diperkenalkan pada Januari 2021.







Artikel ini, ditujukan untuk pengembang web berpengalaman, membahas (dan memecahkan) masalah penggunaan Redux dalam apa yang disebut. ekstensi Chrome yang digerakkan oleh peristiwa ( digerakkan oleh peristiwa).







Kekhususan ekstensi yang digerakkan oleh peristiwa



Model ekstensi berbasis peristiwa pertama kali muncul di Chrome 22 pada tahun 2012. Dalam model ini, skrip latar belakang ekstensi (jika ada) dimuat / dijalankan hanya saat diperlukan (terutama sebagai respons terhadap peristiwa) dan dikeluarkan dari memori saat tidak melakukan apa-apa.







Dokumentasi pengembang Chrome sangat menyarankan penggunaan model berbasis peristiwa untuk semua ekstensi baru, dan bermigrasi untuk ekstensi yang ada menggunakan model persisten . Namun, ada satu pengecualian ( di MV3 tidak lagi relevan, termasuk oleh karena itu transisi ke model baru di MV3 adalah wajib)). Namun tampaknya banyak ekstensi yang masih menggunakan model persisten, meskipun ekstensi tersebut mungkin didorong oleh peristiwa. Tentu saja, banyak dari mereka yang pertama kali dirilis sebelum model berbasis peristiwa dikenal. Dan sekarang penulisnya tidak memiliki insentif untuk beralih ke model baru. Di satu sisi, ini (belum) opsional, tetapi di sisi lain, ini berarti perlu banyak perubahan, tidak hanya di skrip latar belakang, tetapi juga di komponen ekstensi lainnya. Selain itu, banyak yang menggunakan pendekatan lintas browser saat mengembangkan.dengan mengumpulkan ekstensi yang sudah jadi untuk browser yang berbeda dari kode sumber yang sama. Model berbasis peristiwa saat ini hanya didukung di Chrome dan sangat berbeda dari model persisten yang didukung oleh browser lain. Secara alami, ini mempersulit pengembangan lintas-browser.







Namun, beberapa ekstensi Chrome yang relatif lebih baru juga menggunakan model persisten, meskipun dapat digerakkan oleh peristiwa. Pada akhirnya, alasannya sama dengan kasus migrasi: ada perbedaan signifikan antara model yang digerakkan oleh peristiwa dan model persisten, yang terutama diekspresikan dalam cara kami mengelola status ekstensi.







Masalah Redux



— , -. - ( .. ), , . Redux.







Redux — , , . Redux .







, " " — Redux, . ( ), . , Webext Redux, . - - - . .







(persistent) , , . (, ) , . , , Webext Redux.













- , , , , . , , .. ( ). .









, chrome.storage



/ / . ( ) , chrome.storage



, API , .













API chrome.storage



, — . — , , " ".







, , -, . , , .







— API chrome.storage



Redux, Redux. , chrome.storage



, . , Redux - . - chrome.storage



Redux, , Redux chrome.storage



).







— Redux- chrome.storage



, chrome.storage



Redux. API chrome.storage



Redux, (store) Redux. createStore



Store



( Redux). :











, , Store



. ReduxedStorage



.







getState



subscribe



, .. chrome.storage



: get



onChanged



. , Store



, . , get



chrome.storage



ReduxedStorage



, onChanged



, . . getState



. subscribe



: - , onChanged



.







getState



subscribe



, chrome.storage



Store.dispatch



. set



, Redux, Redux , , dispatch



. - dispatch



ReduxedStorage



. . Redux , , Redux. , .







, , - . , , . , dispatch



, , "" createStore



, "" Store.dispatch



, dispatch



. , , , chrome.storage



, . chrome.storage.onChanged



, .







: chrome.storage:get



, . chrome.storage:get



, ( ). , init



, , , chrome.storage:get



. init



Redux, , , chrome.storage



.







ReduxedStorage



:









: chrome.storage



(this.key



), () chrome.storage.onChanged



, chrome.storage:get



. , , .. chrome.storage



.







, , - , this.state



, chrome.storage:set



, . . Redux dispatch



this.state



, , .. this.state



. , . 2- dispatch



this.state



, - chrome.storage:set



. , .







, dispatch



, Redux. ( 100 ), . — . dispatch



:







dispatch


, , . Redux. , Redux, middleware, Redux Thunk. Redux Thunk , , . :









delayAddTodo



'ADD_TODO'



1 .







dispatch



, this.buffStore.getState



this.buffStore.subscribe



. this.buffStore.subscribe



1 dispatch



, this.buffStore



null



( 100 dispatch



). dispatch



, .. , subscribe



.







, , .. , , Redux. , — , - , delayAddTodo



. , , Redux dispatch



. , this.buffStore



, , lastStore



. , this.buffStore



, lastStore



subscribe



. , subscribe



lastStore



, this.buffStore



, " "). subscribe



, / lastStore



, .







, , ..:







  • this.areaName



    , this.key



    / .
  • , API chrome.storage



    , , WrappedStorage



    .


, :









Penggunaannya mirip dengan Redux asli, kecuali bahwa di antarmuka kami, pembuat toko dibungkus dalam sebuah fungsi dan dijalankan secara asinkron, mengembalikan sebuah janji alih-alih penyimpanan yang dibuat.







Penggunaan standar antarmuka terlihat seperti ini:







Penggunaan standar


Selain itu, dengan sintaks yang async/await



tersedia mulai ES 2017, antarmuka ini dapat digunakan seperti ini:







Penggunaan lanjutan


Kode sumber tersedia di Github.







Antarmuka ini juga tersedia sebagai paket di NPM:







npm install reduxed-chrome-storage
      
      






All Articles