Öffnen Sie die Entwicklerkonsole in Ihrem Browser. Wenn Sie „Hallo Welt“ sehen, wissen Sie, dass es ordnungsgemäß geladen wird.

Browser unterstützen jetzt ECMAScript-Module. Sie können andere Dateien aufgrund ihrer Nebenwirkungen importieren:

import \\\"./some-other-script.js\\\";

oder für ihre Exporte

import { add, multiply } \\\"./my-math-lib.js\\\";

Ziemlich cool, oder? Weitere Informationen finden Sie im MDN-Leitfaden oben.

Pakete

Sie möchten das Rad wahrscheinlich nicht neu erfinden, daher wird Ihr Projekt wahrscheinlich einige Pakete von Drittanbietern verwenden. Das bedeutet nicht, dass Sie jetzt einen Paketmanager verwenden müssen.

Angenommen, wir möchten Superstruct zur Datenvalidierung verwenden. Wir können Module nicht nur von unserem eigenen (lokalen) Dateiserver laden, sondern von jeder URL. esm.sh stellt bequem Module für fast alle auf npm verfügbaren Pakete bereit.

Wenn Sie https://esm.sh/superstruct besuchen, können Sie sehen, dass Sie zur neuesten Version weitergeleitet werden. Sie können dieses Paket wie folgt in Ihren Code einbinden:

import { assert } from \\\"https://esm.sh/superstruct\\\";

Wenn Sie auf Nummer sicher gehen möchten, können Sie Versionen anpinnen.

Typen

Ich weiß nicht, wie es dir geht, aber TypeScript hat mich verwöhnt (und faul gemacht). Das Schreiben von einfachem JavaScript ohne die Hilfe des Typprüfers fühlt sich an, als würde man auf einem Drahtseil schreiben. Zum Glück müssen wir auch nicht auf die Typprüfung verzichten.

Es ist an der Zeit, npm auszumerzen (auch wenn wir keinen von ihm bereitgestellten Code versenden).

npm init --yesnpm install typescript

Sie können den TypeScript-Compiler problemlos für JavaScript-Code verwenden! Dafür gibt es erstklassigen Support. Erstellen Sie eine jsconfig.json:

{  \\\"compilerOptions\\\": {    \\\"strict\\\": true,    \\\"checkJs\\\": true,    \\\"allowJs\\\": true,    \\\"noImplicitAny\\\": true,    \\\"lib\\\": [\\\"ES2022\\\", \\\"DOM\\\"],    \\\"module\\\": \\\"ES2022\\\",    \\\"target\\\": \\\"ES2022\\\"  },  \\\"include\\\": [\\\"**/*.js\\\"],  \\\"exclude\\\": [\\\"node_modules\\\"]}

Jetzt ausführen

npm run tsc --watch -p jsconfig.json

und machen Sie einen Typfehler in Ihrem Code. Der TypeScript-Compiler sollte sich beschweren:

/** @type {number} **/const num = \\\"hello\\\";

Übrigens ist der Kommentar, den Sie oben sehen, JSDoc. Auf diese Weise können Sie Ihr JavaScript mit Typen annotieren. Es ist zwar etwas ausführlicher als die Verwendung von TypeScript und man gewöhnt sich ziemlich schnell daran. Es ist auch sehr leistungsfähig, solange Sie keine verrückten Typen schreiben (was Sie bei den meisten Projekten nicht tun sollten), sollte alles in Ordnung sein.

Wenn Sie einen komplizierten Typ (Helfer) benötigen, können Sie jederzeit etwas TypeScript in eine .d.ts-Datei hinzufügen.

Ist JSDoc nur ein Sprungbrett für Leute, die mit großen JavaScript-Projekten festsitzen, um schrittweise auf TypeScript migrieren zu können? Das glaube ich nicht! Das TypeScript-Team fügt JSDoc TypeScript auch weiterhin großartige Funktionen hinzu, beispielsweise in der kommenden TypeScript-Version. Die automatische Vervollständigung funktioniert auch in VS Code hervorragend.

Karten importieren

Wir haben gelernt, wie wir externe Pakete ohne Build-Tool zu unserem Projekt hinzufügen können. Wenn Sie Ihren Code jedoch in viele Module aufteilen, kann das wiederholte Ausschreiben der vollständigen URL etwas ausführlich sein.

Wir können dem Kopfabschnitt unserer index.html eine Importzuordnung hinzufügen:

Jetzt können wir dieses Paket einfach importieren mit

import {} from \\\"superstruct\\\"

Wie ein „normales“ Projekt. Ein weiterer Vorteil besteht darin, dass die Vervollständigung und Erkennung von Typen wie erwartet funktioniert, wenn Sie das Paket lokal installieren.

npm install --save-dev superstruct

Beachten Sie, dass die Version in Ihrem node_modules-Verzeichnis nicht verwendet wird. Sie können es entfernen und Ihr Projekt wird weiterhin ausgeführt.

Ein Trick, den ich gerne verwende, ist das Hinzufügen:

      \\\"cdn/\\\": \\\"https://esm.sh/\\\",

Zu meiner Importkarte. Dann kann jedes über esm.sh verfügbare Projekt durch einfaches Importieren verwendet werden. Z.B.:

import Peer from \\\"cdn/peerjs\\\";

Wenn Sie auch für diesen Importtyp Typen aus node_modules für die Entwicklung abrufen möchten, müssen Sie Folgendes zu den CompilerOptions Ihrer jsconfig.json hinzufügen:

    \\\"paths\\\": {      \\\"cdn/*\\\": [\\\"./node_modules/*\\\", \\\"./node_modules/@types/*\\\"]    },

Einsatz

Um Ihr Projekt bereitzustellen, kopieren Sie alle Dateien auf einen statischen Dateihost und fertig! Wenn Sie jemals an einem älteren JavaScript-Projekt gearbeitet haben, wissen Sie, wie schmerzhaft es ist, Build-Tools zu aktualisieren, die noch nicht einmal ein bis zwei Jahre alt sind. Mit diesem Projektaufbau wird Ihnen nicht das gleiche Schicksal widerfahren.

Testen

Wenn Ihr JavaScript nicht von Browser-APIs abhängt, können Sie einfach den Testläufer verwenden, der im Lieferumfang von Node.js enthalten ist. Aber warum schreiben Sie nicht Ihren eigenen Testläufer, der direkt im Browser läuft?

/** @type {[string, () => Promise | void][]} */const tests = [];/** * * @param {string} description * @param {() => Promise | void} testFunc */export async function test(description, testFunc) {  tests.push([description, testFunc]);}export async function runAllTests() {  const main = document.querySelector(\\\"main\\\");  if (!(main instanceof HTMLElement)) throw new Error();  main.innerHTML = \\\"\\\";  for (const [description, testFunc] of tests) {    const newSpan = document.createElement(\\\"p\\\");    try {      await testFunc();      newSpan.textContent = `✅ ${description}`;    } catch (err) {      const errorMessage =        err instanceof Error && err.message ? ` - ${err.message}` : \\\"\\\";      newSpan.textContent = `❌ ${description}${errorMessage}`;    }    main.appendChild(newSpan);  }}/** * @param {any} val */export function assert(val, message = \\\"\\\") {  if (!val) throw new Error(message);}

Erstellen Sie nun eine Datei example.test.js.

import { test, assert } from \\\"@/test.js\\\";test(\\\"1 1\\\", () => {  assert(1   1 === 2);});

Und eine Datei, in die Sie alle Ihre Tests importieren:

import \\\"./example.test.js\\\";console.log(\\\"This should only show up when running tests\\\");

Führen Sie dies beim Laden der Seite aus:

await import(\\\"@/test/index.js\\\"); // file that imports all tests(await import(\\\"@/test.js\\\")).runAllTests();

Und Sie haben ein perfektes TDD-Setup. Um nur einen Teil der Tests auszuführen, können Sie einige .test.js-Importe auskommentieren, aber die Testausführungsgeschwindigkeit sollte erst dann zum Problem werden, wenn Sie viele Tests angesammelt haben.

Vorteile

Wieso würdest du das machen? Nun, die Verwendung weniger Abstraktionsebenen erleichtert das Debuggen Ihres Projekts. Dazu kommt das Credo „Nutzung der Plattform“. Die erlernten Fähigkeiten lassen sich besser auf andere Projekte übertragen. Ein weiterer Vorteil besteht darin, dass, wenn Sie in 10 Jahren zu einem so erstellten Projekt zurückkehren, es immer noch funktioniert und Sie keine Archäologie betreiben müssen, um zu versuchen, ein Build-Tool wiederzubeleben, das seit 8 Jahren nicht mehr existiert. Eine Erfahrung, mit der viele Webentwickler, die an Legacy-Projekten gearbeitet haben, vertraut sein werden.

Weitere Ideen finden Sie auf plainvanillaweb.com.

","image":"http://www.luping.net/uploads/20240807/172301184466b313046f19c.jpg","datePublished":"2024-08-07T14:24:03+08:00","dateModified":"2024-08-07T14:24:03+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Webentwicklung ohne (Build-)Tools

Webentwicklung ohne (Build-)Tools

Veröffentlicht am 07.08.2024
Durchsuche:477

Web Development Without (Build) Tooling

Wenn wir ein neues Webprojekt starten, bei dem JavaScript verwendet wird, richten wir oft als Erstes Build- und Entwicklertools ein. Zum Beispiel Vite, das heutzutage sehr beliebt ist. Möglicherweise wissen Sie nicht, dass komplizierte Build-Tools nicht für alle JavaScript-(Web-)Projekte erforderlich sind. Tatsächlich ist es jetzt einfacher als je zuvor, darauf zu verzichten, wie ich in diesem Artikel zeigen werde.

Erstellen Sie ein neues Projekt mit einer index.html-Datei.


  
  
  
    

Hello world

Wenn Sie VS Code verwenden, installieren Sie die Live Preview-Erweiterung. Starte es. Dies ist ein einfacher Dateiserver mit Live-Reload. Sie können jeden Dateiserver verwenden. Python verfügt über einen integrierten:

python3 -m http.server

Ich mag die Live-Vorschau, weil sie die Seite automatisch aktualisiert, nachdem Änderungen an einer Datei vorgenommen wurden.

Sie sollten jetzt über den Browser auf Ihre index.html-Datei zugreifen können und „Hallo Welt“ sehen.

Als nächstes erstellen Sie eine index.js-Datei:

console.log("Hello world");

export {};

Fügen Sie es in Ihre index.html ein:


Öffnen Sie die Entwicklerkonsole in Ihrem Browser. Wenn Sie „Hallo Welt“ sehen, wissen Sie, dass es ordnungsgemäß geladen wird.

Browser unterstützen jetzt ECMAScript-Module. Sie können andere Dateien aufgrund ihrer Nebenwirkungen importieren:

import "./some-other-script.js";

oder für ihre Exporte

import { add, multiply } "./my-math-lib.js";

Ziemlich cool, oder? Weitere Informationen finden Sie im MDN-Leitfaden oben.

Pakete

Sie möchten das Rad wahrscheinlich nicht neu erfinden, daher wird Ihr Projekt wahrscheinlich einige Pakete von Drittanbietern verwenden. Das bedeutet nicht, dass Sie jetzt einen Paketmanager verwenden müssen.

Angenommen, wir möchten Superstruct zur Datenvalidierung verwenden. Wir können Module nicht nur von unserem eigenen (lokalen) Dateiserver laden, sondern von jeder URL. esm.sh stellt bequem Module für fast alle auf npm verfügbaren Pakete bereit.

Wenn Sie https://esm.sh/superstruct besuchen, können Sie sehen, dass Sie zur neuesten Version weitergeleitet werden. Sie können dieses Paket wie folgt in Ihren Code einbinden:

import { assert } from "https://esm.sh/superstruct";

Wenn Sie auf Nummer sicher gehen möchten, können Sie Versionen anpinnen.

Typen

Ich weiß nicht, wie es dir geht, aber TypeScript hat mich verwöhnt (und faul gemacht). Das Schreiben von einfachem JavaScript ohne die Hilfe des Typprüfers fühlt sich an, als würde man auf einem Drahtseil schreiben. Zum Glück müssen wir auch nicht auf die Typprüfung verzichten.

Es ist an der Zeit, npm auszumerzen (auch wenn wir keinen von ihm bereitgestellten Code versenden).

npm init --yes
npm install typescript

Sie können den TypeScript-Compiler problemlos für JavaScript-Code verwenden! Dafür gibt es erstklassigen Support. Erstellen Sie eine jsconfig.json:

{
  "compilerOptions": {
    "strict": true,
    "checkJs": true,
    "allowJs": true,
    "noImplicitAny": true,
    "lib": ["ES2022", "DOM"],
    "module": "ES2022",
    "target": "ES2022"
  },
  "include": ["**/*.js"],
  "exclude": ["node_modules"]
}

Jetzt ausführen

npm run tsc --watch -p jsconfig.json

und machen Sie einen Typfehler in Ihrem Code. Der TypeScript-Compiler sollte sich beschweren:

/** @type {number} **/
const num = "hello";

Übrigens ist der Kommentar, den Sie oben sehen, JSDoc. Auf diese Weise können Sie Ihr JavaScript mit Typen annotieren. Es ist zwar etwas ausführlicher als die Verwendung von TypeScript und man gewöhnt sich ziemlich schnell daran. Es ist auch sehr leistungsfähig, solange Sie keine verrückten Typen schreiben (was Sie bei den meisten Projekten nicht tun sollten), sollte alles in Ordnung sein.

Wenn Sie einen komplizierten Typ (Helfer) benötigen, können Sie jederzeit etwas TypeScript in eine .d.ts-Datei hinzufügen.

Ist JSDoc nur ein Sprungbrett für Leute, die mit großen JavaScript-Projekten festsitzen, um schrittweise auf TypeScript migrieren zu können? Das glaube ich nicht! Das TypeScript-Team fügt JSDoc TypeScript auch weiterhin großartige Funktionen hinzu, beispielsweise in der kommenden TypeScript-Version. Die automatische Vervollständigung funktioniert auch in VS Code hervorragend.

Karten importieren

Wir haben gelernt, wie wir externe Pakete ohne Build-Tool zu unserem Projekt hinzufügen können. Wenn Sie Ihren Code jedoch in viele Module aufteilen, kann das wiederholte Ausschreiben der vollständigen URL etwas ausführlich sein.

Wir können dem Kopfabschnitt unserer index.html eine Importzuordnung hinzufügen:


Jetzt können wir dieses Paket einfach importieren mit

import {} from "superstruct"

Wie ein „normales“ Projekt. Ein weiterer Vorteil besteht darin, dass die Vervollständigung und Erkennung von Typen wie erwartet funktioniert, wenn Sie das Paket lokal installieren.

npm install --save-dev superstruct

Beachten Sie, dass die Version in Ihrem node_modules-Verzeichnis nicht verwendet wird. Sie können es entfernen und Ihr Projekt wird weiterhin ausgeführt.

Ein Trick, den ich gerne verwende, ist das Hinzufügen:

      "cdn/": "https://esm.sh/",

Zu meiner Importkarte. Dann kann jedes über esm.sh verfügbare Projekt durch einfaches Importieren verwendet werden. Z.B.:

import Peer from "cdn/peerjs";

Wenn Sie auch für diesen Importtyp Typen aus node_modules für die Entwicklung abrufen möchten, müssen Sie Folgendes zu den CompilerOptions Ihrer jsconfig.json hinzufügen:

    "paths": {
      "cdn/*": ["./node_modules/*", "./node_modules/@types/*"]
    },

Einsatz

Um Ihr Projekt bereitzustellen, kopieren Sie alle Dateien auf einen statischen Dateihost und fertig! Wenn Sie jemals an einem älteren JavaScript-Projekt gearbeitet haben, wissen Sie, wie schmerzhaft es ist, Build-Tools zu aktualisieren, die noch nicht einmal ein bis zwei Jahre alt sind. Mit diesem Projektaufbau wird Ihnen nicht das gleiche Schicksal widerfahren.

Testen

Wenn Ihr JavaScript nicht von Browser-APIs abhängt, können Sie einfach den Testläufer verwenden, der im Lieferumfang von Node.js enthalten ist. Aber warum schreiben Sie nicht Ihren eigenen Testläufer, der direkt im Browser läuft?

/** @type {[string, () => Promise | void][]} */
const tests = [];

/**
 *
 * @param {string} description
 * @param {() => Promise | void} testFunc
 */
export async function test(description, testFunc) {
  tests.push([description, testFunc]);
}

export async function runAllTests() {
  const main = document.querySelector("main");
  if (!(main instanceof HTMLElement)) throw new Error();
  main.innerHTML = "";

  for (const [description, testFunc] of tests) {
    const newSpan = document.createElement("p");

    try {
      await testFunc();
      newSpan.textContent = `✅ ${description}`;
    } catch (err) {
      const errorMessage =
        err instanceof Error && err.message ? ` - ${err.message}` : "";
      newSpan.textContent = `❌ ${description}${errorMessage}`;
    }
    main.appendChild(newSpan);
  }
}

/**
 * @param {any} val
 */
export function assert(val, message = "") {
  if (!val) throw new Error(message);
}

Erstellen Sie nun eine Datei example.test.js.

import { test, assert } from "@/test.js";

test("1 1", () => {
  assert(1   1 === 2);
});

Und eine Datei, in die Sie alle Ihre Tests importieren:

import "./example.test.js";

console.log("This should only show up when running tests");

Führen Sie dies beim Laden der Seite aus:

await import("@/test/index.js"); // file that imports all tests
(await import("@/test.js")).runAllTests();

Und Sie haben ein perfektes TDD-Setup. Um nur einen Teil der Tests auszuführen, können Sie einige .test.js-Importe auskommentieren, aber die Testausführungsgeschwindigkeit sollte erst dann zum Problem werden, wenn Sie viele Tests angesammelt haben.

Vorteile

Wieso würdest du das machen? Nun, die Verwendung weniger Abstraktionsebenen erleichtert das Debuggen Ihres Projekts. Dazu kommt das Credo „Nutzung der Plattform“. Die erlernten Fähigkeiten lassen sich besser auf andere Projekte übertragen. Ein weiterer Vorteil besteht darin, dass, wenn Sie in 10 Jahren zu einem so erstellten Projekt zurückkehren, es immer noch funktioniert und Sie keine Archäologie betreiben müssen, um zu versuchen, ein Build-Tool wiederzubeleben, das seit 8 Jahren nicht mehr existiert. Eine Erfahrung, mit der viele Webentwickler, die an Legacy-Projekten gearbeitet haben, vertraut sein werden.

Weitere Ideen finden Sie auf plainvanillaweb.com.

Freigabeerklärung Dieser Artikel wird unter: https://dev.to/louwers/web-development-without-tooling-flk?1 reproduziert. Wenn ein Verstöße vorliegt, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3