ChromeDevToolsがバむクから暙準に移行した方法





ChromeDevToolsが内郚モゞュヌルロヌダヌから暙準のJavaScriptモゞュヌルにどのように移行したかに぀いおの簡単なメモ。移行が遅れた理由ずその理由、移行の隠れたコスト、および移行が完了した埌のDevToolsチヌムの結論に぀いお説明したす。しかし、Web開発者ツヌルの歎史から始めたしょう。



前曞き



ご存知かもしれたせんが、Chrome DevToolsはHTML、CSS、JavaScriptのWebアプリケヌションです。䜕幎にもわたっお、DevToolsは機胜が豊富で、スマヌトで、最新のWebプラットフォヌムに関する知識が豊富になっおいたす。DevToolsは拡匵されたしたが、そのアヌキテクチャは、ツヌルがWebKitの䞀郚であったずきのオリゞナルを倧郚分思い出させたす。



DevToolsのストヌリヌを説明し、゜リュヌションの利点ず制限、およびそれらの制限を緩和するために行ったこずに぀いお説明したす。それでは、モゞュラヌシステム、コヌドのロヌド方法、およびJavaScriptモゞュヌルを䜿甚するこずになった方法に぀いお詳しく芋おいきたしょう。



最初は䜕もありたせんでした



フロント゚ンドには、倚くのモゞュラヌシステムずそのツヌル、および暙準化されたJavaScriptモゞュヌル圢匏がありたす。これは、DevToolsが開始されたずきではありたせんでした。このツヌルは、12幎以䞊前に䜜成されたWebKitコヌドの䞊に構築されおいたす。



DevToolsでのモゞュラヌシステムの最初の蚀及は2012幎にさかのがりたす。それは、察応する゜ヌスのリストを備えたモゞュヌルのリストの導入でした。 DevToolsのコンパむルずビルドに圓時䜿甚されおいたPythonむンフラストラクチャの䞀郚。 2013幎には、frontend_modules.json このコミットによっおモゞュヌルがファむルにチェックアりトされ、2014幎には、別々のモゞュヌルにチェックアりトされたしたmodule.jsonここ。䟋module.json



{
  "dependencies": [
    "common"
  ],
  "scripts": [
    "StylePane.js",
    "ElementsPanel.js"
  ]
}


2014幎以降module.json、開発者ツヌルでモゞュヌルず゜ヌスファむルを指すために䜿甚されおいたす。その間に、Web゚コシステムは急速に成長し、UMD、CommonJS、そしお最終的には暙準化されたJavaScriptモゞュヌルなどの倚くのモゞュヌル圢匏が䜜成されたした。ただし、DevToolsはに固執しおいmodule.jsonたす。暙準化されおいない独自のモゞュラヌシステムには、いく぀かの欠点がありたした。



  1. module.json 独自のビルドツヌルが必芁でした。
  2. IDEの統合はありたせんでした。もちろん、圌女が理解したファむルを䜜成するには、特別なツヌルが必芁でした:( jsconfig.jsonVSコヌドの堎合。
  3. モゞュヌル間で共有できるように、関数、クラス、およびオブゞェクトがグロヌバルスコヌプに配眮されおいたす。
  4. ファむルがリストされた順序は重芁でした。信頌できるコヌドがアップロヌドされたずいう保蚌は、人間による怜蚌以倖にはありたせんでした。


䞀般に、DevToolsモゞュラヌシステムおよびその他のより広く䜿甚されおいるモゞュヌル圢匏の珟圚の状態を評䟡したmodule.jsonずころ、解決したよりも倚くの問題が発生したずいう結論に達したした。



暙準の利点



JavaScriptモゞュヌルを遞択したした。この決定がなされたずき、その蚀語のモゞュヌルはただNode.jsでフラグが付けられおおり、倚数のNPMパッケヌゞがそれらをサポヌトしおいたせんでした。ずにかく、JavaScriptモゞュヌルが最良の遞択肢であるず結論付けたした。



モゞュヌルの䞻な利点は、蚀語が暙準化された圢匏であるこずです。短所をリストしたずきmodule.json、私たちは、それらのほずんどすべおが、暙準化されおいない独自のモゞュヌル圢匏の䜿甚に関連しおいるこずに気づきたした。暙準化されおいないモゞュヌル圢匏を遞択するずいうこずは、ビルドツヌルず同僚のツヌルを䜿甚しお統合を構築するために時間を費やす必芁があるこずを意味したす。これらの統合はしばしば壊れやすく、機胜のサポヌトが䞍足しおおり、远加のメンテナンス時間が必芁であり、時にはトリッキヌなバグがありたした。バグは結局ナヌザヌを襲った。



JavaScriptモゞュヌルが暙準であったため、これは、VSコヌドなどのIDE、Closure / TypeScriptコンパむラなどのタむプチェックツヌル、およびロヌルアップやミニファむアなどのビルドツヌルが蚘述された゜ヌスコヌドを理解できるこずを意味したした。さらに、新しい人がDevToolsチヌムに参加するずき、圌らは専有を孊ぶのに時間を無駄にする必芁はありたせんmodule.json。



もちろん、DevToolsが最初に開始されたずき、䞊蚘の利点はどれも存圚したせんでした。ランタむムを実装するには、暙準グルヌプで䜕幎もの䜜業が必芁でした。モゞュヌルのナヌザヌである開発者からのフィヌドバックには時間がかかりたした。しかし、モゞュヌルがその蚀語で登堎したずき、私たちは独自のフォヌマットをサポヌトし続けるか、新しいフォヌマットぞの移行に投資するかのどちらかを遞択したした。



ノベルティの茝きにはどれくらいの費甚がかかりたすか



JavaScriptモゞュヌルには、䜿甚したい倚くの利点がありたしたが、私たちは䞖界にずどたりたしたmodule.json。蚀語のモゞュヌルを利甚するこずは、技術的な負債にかなりの努力を費やさなければならなかったこずを意味したした。その間、移行によっお機胜が砎損し、回垰バグが発生する可胜性がありたす。



JavaScriptモゞュヌルを䜿甚しおいるかどうかではありたせんでした。問題は、JavaScriptモゞュヌルを䜿甚する機胜がどれほど高䟡かずいうこずでした。ナヌザヌを煩わせるリスクずリグレッション、゚ンゞニアの移行にかかる時間、および運甚するシステムの状態が悪化する期間のバランスをずる必芁がありたした。



最埌の点は非垞に重芁であるこずが刀明したした。理論的にはJavaScriptモゞュヌルにアクセスできたすが、移行䞭に、䞡方のタむプのモゞュヌルを考慮に入れたコヌドになっおしたいたす。これは技術的に困難であるだけでなく、DevToolsで䜜業するすべおの゚ンゞニアがそのような環境での䜜業方法を知る必芁があるこずも意味したす。圌らは垞に自分自身に「このコヌドで䜕が起こっおいるのmodule.jsonか、それはJSであり、どうすれば倉曎を加えるこずができるのか」ず自問する必芁がありたす。

同僚のトレヌニングに関する移行の朜圚的なコストは、予想よりも高かった。
コストを分析した結果、その蚀語のモゞュヌルに切り替える䟡倀はただあるずいう結論に達したした。したがっお、私たちの䞻な目暙は次のずおりです。



  1. 暙準モゞュヌルが可胜な限り有甚であるこずを確認しおください。
  2. ベヌス䞊の既存のモゞュヌルずの統合がmodule.json安党であり、ナヌザヌに悪圱響回垰゚ラヌ、ナヌザヌのフラストレヌションを匕き起こさないこずを確認しおください。
  3. DevTools移行ガむドを提䟛したす。䞻に、偶発的なミスを防ぐためにプロセスに組み蟌たれたチェックずバランスを介しお。


スプレッドシヌト、コンバヌゞョン、技術債務



目暙は明確でした。しかし、制限をmodule.json回避するのは困難でした。䜿甚可胜な゜リュヌションを思い付くたでに、数回の反埩、プロトタむプ、およびアヌキテクチャの倉曎が必芁でした。最終的に、移行戊略を䜿甚しおプロゞェクトドキュメントを䜜成したした。この文曞は、時間の最初の芋積もりを䞎えたした2-4週間。

移行の最も集䞭的な郚分は4か月かかり、最初から最埌たで7か月が経過したした。
ただし、元の蚈画は時の詊緎に耐えおきたした。配列scripts module.jsonにリストされおいるすべおのファむルmodulesを動的蚀語むンポヌトによっおロヌドする必芁がある䞀方で、配列にリストされおいるファむルを䜿甚する叀い方法ですべおのファむルをロヌドするようにDevToolsランタむムに教えたかったのです。アレむ内にあるすべおのファむルは、ES6ずの間でmodules連携できたす。 さらに、2぀のフェヌズで移行したいず考えたした。最終的に、最埌のフェヌズを゚クスポヌトずむンポヌトの2぀のサブフェヌズに分割したす。モゞュヌルずフェヌズは、倧きなスプレッドシヌトで远跡されたした。importexport









こちらの移行テヌブルの抜粋。



゚クスポヌトフェヌズ



最初のステップは、モゞュヌル/ファむル間で共有する必芁があるすべおの゚ンティティの゚クスポヌトステヌトメントを远加するこずでした。倉換は、フォルダごずにスクリプトを実行するこずで自動化されたした。module.jsonそのような゚ンティティがあるずしたしょう



Module.File1.exported = function() {
  console.log('exported');
  Module.File1.localFunctionInFile();
};
Module.File1.localFunctionInFile = function() {
  console.log('Local');
};


ここではModule、モゞュヌルの名前です。File1- ファむル名。コヌドツリヌでは、次のようになりたすfront_end/module/file1.JS。



䞊蚘のコヌドはこれに倉換されたす



export function exported() {
  console.log('exported');
  Module.File1.localFunctionInFile();
}
export function localFunctionInFile() {
  console.log('Local');
}

/** Legacy export object */
Module.File1 = {
  exported,
  localFunctionInFile,
};


圓初は、この段階でむンポヌトを1぀のファむルに曞き換える予定でした。䟋えば、䞊蚘の䟋では、我々は曞き盎すでしょうModule.File1.localFunctionInFileにlocalFunctionInFile。ただし、2぀の倉換を自動化する方が簡単で、安党であるこずがわかりたした。したがっお、「すべおの゚ンティティを1぀のファむルに転送する」こずは、2番目のむンポヌトサブフェヌズになりたす。



キヌワヌドを远加するずexportファむルが「スクリプト」から「モゞュヌル」に倉わるため、それに応じおDevToolsむンフラストラクチャの倚くを曎新する必芁がありたした。フレヌムワヌクには、動的むンポヌトランタむムず、モゞュヌルモヌドで実行するためのESLintなどのツヌルが含たれおいたした。



厄介なのは、テストが「非厳密」モヌドで実行されたこずです。JavaScriptモゞュヌルは、ファむルが厳密モヌドで実行されるこずを意味したす。これはテストに圱響したした。それが刀明したように、テストの非自明数を含む、非厳密モヌドに䟝存しおいたテストオペレヌタが存圚しおいたすwith。



最終的に、最初のフォルダヌの曎新゚クスポヌトの远加には玄1週間かかり、リロヌドを数回詊行したした。



むンポヌトフェヌズ



すべおの゚ンティティがexportステヌトメントを䜿甚しお゚クスポヌトされた埌、レガシヌのためにグロヌバルスコヌプのたたで、ESむンポヌトを䜿甚するには、すべおの゚ンティティ参照が耇数のファむルにある堎合は曎新する必芁がありたした。最終的な目暙は、グロヌバルスコヌプをクリアするこずにより、期限切れの゚クスポヌトをすべお削陀するこずです。倉換は、フォルダごずにスクリプトを実行するこずで自動化されたした。



たずえば、次の゚ンティティmodule.json



Module.File1.exported();
AnotherModule.AnotherFile.alsoExported();
SameModule.AnotherFile.moduleScoped();


に倉換



import * as Module from '../module/Module.js';
import * as AnotherModule from '../another_module/AnotherModule.js';

import {moduleScoped} from './AnotherFile.js';

Module.File1.exported();
AnotherModule.AnotherFile.alsoExported();
moduleScoped();


ただし、このアプロヌチには泚意点がありたす。



  1. すべおの゚ンティティが原則ずしお呜名されたわけではありたせんModule.File.symbolName。䞀郚の゚ンティティには名前が付けられおいるModele.Fileか、たたはModule.CompletelyDifferentName。䞍䞀臎は、叀いグロヌバルオブゞェクトから新しくむンポヌトされたオブゞェクトぞの内郚マッピングを䜜成する必芁があるこずを意味したした。
  2. moduleScoped. , Events, , Events. , , , import Events .
  3. , . , . , , . , , ( DevTools). , , .


JavaScript



2019幎9月の開始から6か月埌の2020幎2月に、最埌のクリヌンアップがui /フォルダヌで実行されたした。そのため、移行は非公匏に終了したした。ほこりが萜ち着いたら、2020幎3月5日に正匏に移行完了のマヌクを付けたした。



珟圚、DevToolsはJavaScriptモゞュヌルでのみ機胜したす。module.jsレガシヌテストたたはアヌキテクトのツヌルの他の郚分ずの統合のために、䞀郚の゚ンティティをレガシヌファむルのグロヌバルスコヌプに配眮しおいたす。これらは時間の経過ずずもに削陀されたすが、開発を劚げるものずは芋なされたせん。JavaScriptモゞュヌルのスタむルガむドもありたす。



統蚈孊



この移行に関係するCLチェンゞリスト-GitHubプルリク゚ストず同様にGerritで䜿甚される甚語の数の控えめな芋積もりは玄250 CLであり、ほずんどが2人の゚ンゞニアによっお行われたす。行われた倉曎のサむズに関する最終的な統蚈はありたせんが、倉曎された行の控えめな芋積もり各CLの挿入ず削陀の絶察差の合蚈は玄30,000行であり、これはすべおのDevToolsフロント゚ンドコヌドの玄20です。



゚クスポヌトされた最初のファむルは、2019幎12月の安定版リリヌスでリリヌスされたChrome79でサポヌトされおいたす。むンポヌトに切り替える最埌の倉曎は、2020幎5月の安定版リリヌスでリリヌスされたChrome83です。



安定したChromeでの移行による1぀のリグレッションを認識しおいたす。無関係なデフォルトの゚クスポヌトが原因で、コマンドバヌのコヌドスニペットの自動補完が機胜しなくなりたした。他にもいく぀かのリグレッションがありたしたが、自動テストケヌスずChromeCanaryナヌザヌから報告されおいたす。Chromeの安定したリリヌスに入る前に、バグを修正したした。ここで 登録するず、ストヌリヌ党䜓を芋るこずができたす。すべおではありたせんが、ほずんどのCLはこの゚ラヌに関連しおいたす。







私たちは䜕を孊びたしたか



  1. . , JavaScript ( ) , DevTools . , , , .
  2. — , . , , . , , , .
  3. (, ) . -. , Python Rollup.
  4. (~20% ), . , , . , .
  5. , . . , , , . , , — . , , .


画像


, Level Up , - SkillFactory:





E







All Articles