Rumah  >  Artikel  >  hujung hadapan web  >  Membaiki Ketergantungan Pakej

Membaiki Ketergantungan Pakej

WBOY
WBOYasal
2024-07-19 19:43:32246semak imbas

Fixing Package Dependencies

Kedua-dua Embroider dan pnpm meminta pakej mengisytiharkan kebergantungan mereka dengan betul: Senaraikan kebergantungan (jika dan sahaja) jika ia digunakan.

Ini sukar dilakukan apabila bekerja pada monorepo besar (pertimbangkan apl Ember dengan banyak tambahan Ember dan pakej Node) yang menggunakan yarn@v1. Pembangun boleh lupa untuk mengemas kini package.json's, kerana apl Ember boleh membina dan berjalan walaupun kebergantungan tiada, selagi ia ditarik masuk daripada pakej lain.

Jadi build mahupun run tidak boleh memberitahu kami jika sesetengah pakej tidak mengisytiharkan kebergantungannya dengan betul. Bagaimana lagi kita boleh membetulkan package.json's supaya kita boleh memperkenalkan Embroider dan pnpm?

1. Analisis kod statik

Memandangkan fail, kami dapat melihat kebergantungan yang harus ada, kerana kami tahu cara JavaScript dan Ember berfungsi.

Sebagai contoh, ialah fail JavaScript (atau TypeScript) untuk ditunjukkan,

import { setupIntl } from 'ember-intl/test-support';
import { setupRenderingTest as upstreamSetupRenderingTest } from 'ember-qunit';

export function setupRenderingTest(hooks, options) {
  upstreamSetupRenderingTest(hooks, options);

  // Additional setup for rendering tests can be done here.
  setupIntl(hooks, 'de-de');
}

kita dapat mengetahui daripada pernyataan import bahawa pakej bergantung pada ember-intl dan ember-qunit.

Dan, jika fail templat ditunjukkan,

{{page-title "My App"}}

<WelcomePage />

{{outlet}}

pengetahuan kami tentang Ember dan ekosistem addonnya masing-masing mengarahkan kami ke tajuk-halaman bara, halaman alu-aluan bara dan sumber bara. Walaupun perkara tersirat (mis. kekaburan dalam pendakap kerinting berganda, resolusi modul, suntikan perkhidmatan), kita boleh meneka asal usul aset dengan ketepatan tinggi, terima kasih kepada konvensyen kuat Ember.

2. Codemod

Namun, kita tidak sepatutnya menyemak setiap fail dalam setiap pakej secara manual. Itu memakan masa dan terdedah kepada ralat.

Sebaliknya, kami menulis codemod (benar-benar, linter) menggunakan @codemod-utils. Untuk setiap pakej, codemod menghuraikan perkara yang berkaitan dan mencipta senarai kebergantungan yang perlu ada ("sebenar"). Ia kemudian membandingkan senarai dengan senarai dari package.json ("dijangka").

Untuk menganalisis kod tersirat, perlu ada senarai aset yang diketahui (penciptaan sekali sahaja), yang memetakan setiap pakej yang ingin kami pertimbangkan kepada asetnya. Kita boleh menggunakan Peta untuk merekodkan maklumat tersebut.

const KNOWN_ASSETS = new Map([
  [
    'ember-intl',
    {
      helpers: [
        'format-date',
        'format-list',
        'format-message',
        'format-number',
        'format-relative',
        'format-time',
        't',
      ],
      services: ['intl'],
    },
  ],
  [
    'ember-page-title',
    {
      helpers: ['page-title'],
      services: ['page-title'],
    },
  ],
  [
    'ember-welcome-page',
    {
      components: ['welcome-page'],
    },
  ],
]);

Kini, kerana cara Ember berfungsi, analisis naif terhadap pernyataan import mungkin membawa kepada positif palsu. Ambil contoh berikut:

import Route from '@ember/routing/route';
import fetch from 'fetch';

Apabila kami tidak menyediakan konteks yang betul (iaitu kod ini untuk Ember), codemod akan mempertimbangkan @ember/routing dan fetch sebagai kebergantungan, bukannya ember-source dan (mungkin) ember-fetch. Codemod harus membentangkan analisisnya sedemikian rupa sehingga kita boleh menyemak positif palsu dengan mudah.

// Results for my-package-37

{
  missingDependencies: [
    'ember-asset-loader',
    'ember-truth-helpers'
  ],
  unusedDependencies: [
    '@babel/core',
    'ember-auto-import',
    'ember-cli-babel'
  ],
  unknowns: [
    'Services - host-router (addon/routes/registration.ts)',
  ]
}

3. Keputusan

Codemod yang saya bina (dalam beberapa hari) menganalisis repo pengeluaran dengan 129 pakej dalam 49 saat. Terdapat sejumlah 12,377 fail, tetapi codemod tahu untuk menganalisis hanya 6,013 daripadanya (kurang daripada separuh). Itu purata 0.008 saat/fail dan 0.38 saat/pakej!

Untuk mengetahui lebih lanjut tentang menulis codemods, lihat tutorial utama daripada @codemod-utils.

Atas ialah kandungan terperinci Membaiki Ketergantungan Pakej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:WeakSet dalam JS?Artikel seterusnya:WeakSet dalam JS?