Työkalut

Tällä sivulla käydään läpi kurssilla käytettävät työkalut ja niiden asennus. Se, mitä sivun rakenteesta tarkistetaan ja miksi, käsitellään luentomateriaalin työkaluluvussa.

Editori

Hyvä editori Javascriptin kirjoittamiseen on Visual Studio Code. Huom. tämä on eri asia kuin Visual Studio.

Live Server -laajennuksesta on paljon apua: se tarjoilee tiedostot oikean WWW-palvelimen kautta ja päivittää selaimen automaattisesti. Tämä on tärkeää, koska osa asioista — mm. moduulit ja fetch — ei toimi lainkaan, jos avaat sivun suoraan tiedostojärjestelmästä file://-osoitteella.

Visual Studio Code on iso ja raskas ohjelma, eikä sitä tarvita kaikkeen: pieniin kokeiluihin riittää selaimen konsoli. Jos et halua Microsoftin telemetriaa, käytä VSCodiumia, joka on samasta lähdekoodista käännetty versio. Myös Neovim, Emacs, Sublime Text ja Zed sopivat javascript-koodaukseen hyvin. Valitse työkalu, jonka osaat, äläkä opettele uutta editoria samaan aikaan uuden kielen kanssa.

Emmet: rakenne muutamalla merkillä

Emmet on Visual Studio Coden sisäänrakennettu ominaisuus, jota ei tarvitse asentaa erikseen. Kirjoita lyhenne ja paina sarkainta, niin siitä avautuu kokonainen rakenne. Tämä on ylivoimaisesti nopein tapa kirjoittaa HTML:ää käsin.

ul>li*5              →  ul, jonka sisällä viisi li-elementtiä
div.kortti>h2+p      →  div class="kortti", sisällä h2 ja p
tr>td*3              →  taulukon rivi kolmella solulla
ul>li.rivi$*3        →  li-elementit luokilla rivi1, rivi2, rivi3
a[href=#]{Linkki}    →  a-elementti attribuutteineen ja tekstisisältöineen
!                    →  koko HTML5-dokumentin runko

Emmet toimii myös CSS:ssä: m10 laajenee muotoon margin: 10px; ja df muotoon display: flex;.

Yksi asetus kannattaa muuttaa heti. Emmet kirjoittaa oletuksena tyhjät elementit HTML-tyyliin <br>, mikä ei kelpaa XHTML:ssä. Lisää asetuksiin:

"emmet.syntaxProfiles": {
  "html": { "selfClosingStyle": "xhtml" }
}

Tämän jälkeen Emmet tuottaa <br /> ja <img ... />, eli juuri sitä mitä kurssilla tarvitaan. Tarkista silti muotoilutoiminnon jälkeen, ettei kauttaviivoja ole kadonnut.

Pikanäppäimet, jotka kannattaa opetella

Näistä on eniten hyötyä juuri HTML-, CSS- ja javascript-koodin kanssa. macOS:llä Ctrl on useimmiten Cmd.

NäppäinToimintoMihin
Ctrl+Dvalitse seuraava sama esiintymämuuta kaikki elukat-nimet kerralla ilman etsi ja korvaa -toimintoa
Ctrl+Shift+Lvalitse kaikki esiintymät kerrallasama isommalle joukolle
Alt+klikkauslisää kursorikirjoita samaa useaan kohtaan yhtä aikaa
F2nimeä symboli uudelleenfunktion tai muuttujan nimen vaihto — muuttaa vain oikeat esiintymät
F12siirry määrittelyynmistä tämä funktio tulee?
Alt+←takaisin edelliseen kohtaanpaluu hypyn jälkeen
Ctrl+Välilyöntitäydennysehdotuksetmetodien nimet, CSS-arvot
Shift+Alt+Fmuotoile tiedostosisennykset kuntoon
Ctrl+/kommentoi rivi tai valintakoodin väliaikainen pois kytkeminen
Alt+↑ / Alt+↓siirrä riviäjärjestyksen muuttaminen
Shift+Alt+↓monista rivisamankaltaiset rivit
Ctrl+Shift+Osiirry symboliin tiedostossafunktion etsiminen pitkästä tiedostosta
Ctrl+Pavaa tiedosto nimellänopea siirtyminen tiedostojen välillä
Ctrl+Shift+Pkomentopalettikaikki toiminnot nimellä haettuna
Ctrl+Shift+MProblems-ikkunaESLintin ja tyyppitarkistuksen huomiot
Ctrl+`sisäinen terminaalinpm-komennot

Kaikki pikanäppäimet näkee ja niitä voi muuttaa valinnalla Ctrl+K Ctrl+S.

Asetuksia, joista on hyötyä tällä kurssilla

Asetukset avautuvat komentopaletista komennolla Preferences: Open User Settings (JSON).

{
  // muotoile tiedosto automaattisesti tallennettaessa
  "editor.formatOnSave": true,

  // kun muutat avaustagia, lopetustagi muuttuu mukana
  "editor.linkedEditing": true,

  // kurssin koodityyli: kaksi välilyöntiä, ei sarkaimia
  "editor.tabSize": 2,
  "editor.insertSpaces": true,

  // siisti lopputulos: ei rivin lopun välilyöntejä, rivinvaihto tiedoston loppuun
  "files.trimTrailingWhitespace": true,
  "files.insertFinalNewline": true,

  // Emmet kirjoittaa tyhjät elementit XHTML-muodossa
  "emmet.syntaxProfiles": {
    "html": { "selfClosingStyle": "xhtml" }
  },

  // jos .xhtml-tiedostot eivät saa HTML-väritystä ja täydennystä
  "files.associations": {
    "*.xhtml": "html"
  }
}

editor.linkedEditing on erityisen hyödyllinen XHTML:ssä: kun lopetustagi muuttuu automaattisesti avaustagin mukana, yksi klassinen muotovirheiden lähde katoaa kokonaan.

Muita mainitsemisen arvoisia: File → Auto Save säästää Ctrl+S-painallukset, Alt+Z kytkee rivinvaihdon päälle pitkille riveille, ja sticky scroll pitää funktion tai lohkon otsikon näkyvissä, kun selaat pitkää tiedostoa. Sulkuparien värittäminen ja sulkuparin korostus ovat nykyään mukana vakiona, joten niihin ei tarvita laajennusta.

Hyödyllisiä laajennuksia

Laajennukset asennetaan sivupalkin laatikkokuvakkeesta tai näppäimillä Ctrl+Shift+X. Älä asenna niitä kymmentä kerralla — ota yksi kerrallaan ja katso, onko siitä oikeasti hyötyä.

Sisäänrakennettuina ovat jo mm. HTML:n ja CSS:n täydennys, CSS:n värivalitsin (klikkaa värikoodin vieressä olevaa neliötä), kuvien esikatselu src-attribuutin päällä, tiedostopolkujen täydennys ja Git-integraatio. Näihin ei siis tarvita laajennuksia.

Koodin tarkistus

ESLint omassa editorissa

Suositus: käytä ESLintiä omassa editorissasi. Se on nykyään käytännössä ainoa aktiivisesti kehitetty JavaScript-linter ja tuntee kielen uusimmat ominaisuudet. Se löytää virheet jo kirjoitusvaiheessa, ennen kuin sivua on edes avattu selaimessa.

Asenna ESLint-laajennus Visual Studio Codeen. Lisäksi projektikansioon tarvitaan konfiguraatiotiedosto eslint.config.js:

import js from "@eslint/js";

export default [
  js.configs.recommended,
  {
    languageOptions: {
      ecmaVersion: "latest",
      sourceType: "module",
      globals: { window: "readonly", document: "readonly", console: "readonly" }
    }
  }
];

Varsinainen ESLint asennetaan npm:llä:

npm init -y
npm install --save-dev eslint @eslint/js

Npm tulee Node.js:n mukana. Node.js on ympäristö, jolla voi suorittaa javascriptia muuallakin kuin selaimessa; se ei kuulu tämän kurssin aiheisiin, mutta työkalut asennetaan sillä.

Jos npm:n asentaminen ei onnistu, esimerkiksi yliopiston mikroluokassa, pura projektikansioosi valmis paketti eslint.zip.

JSHint kurssin tehtäväpohjissa

Kurssin viikkotehtäväpohjissa on käytössä JSHint, joka toimii suoraan selaimessa ilman asennuksia ja kirjoittaa huomionsa konsoliin. Se on ollut käytössä pitkään ja on siksi valmiina pohjissa.

JSHint ei kuitenkaan tunne kaikkia uusia kielen ominaisuuksia. Se saattaa siis valittaa koodista, joka on täysin kelvollista ja toimii selaimessa oikein — esimerkiksi uusimmista syntaksirakenteista. Älä säikähdä tällaista varoitusta äläkä ala kirjoittaa koodia vanhanaikaisesti sen takia. Jos epäilet virheilmoituksen aiheellisuutta, tarkista sama koodi ESLintillä: se on ajan tasalla.

Käytännön työnjako on siis tämä: ESLint on työkalusi kirjoittaessa, JSHint on tehtäväpohjan sisäänrakennettu apuri. Kummankin virheilmoitukset kannattaa lukea, mutta ristiriitatilanteessa ESLint on oikeassa.

JSHintin saa myös käyttäjäskriptinä mille tahansa sivulle: jshint.user.js. Käyttäjäskriptien asentamisesta kerrotaan alempana.

//@ts-check

Kirjoita tiedoston alkuun seuraava rivi, jos haluat Visual Studio Coden ajavan TypeScriptin tyyppitarkistuksen ohjelmakoodillesi. Koodisi ei tarvitse olla TypeScriptiä.

//@ts-check

Mahdolliset ongelmat näet Problems-ikkunassa (View | Problems, Ctrl+Shift+M). Tämä löytää yllättävän suuren osan kirjoitusvirheistä ja on ilmainen, koska TypeScript-palvelin tulee VS Coden mukana. Saatat saada myös joitain turhia virheilmoituksia.

Selaimen kehittäjätyökalut

Firefoxin ja Chromen kehittäjätyökalut ovat tärkein työkalusi. Ne avataan F12-näppäimellä tai valikosta Tools → Browser Tools → Web Developer Tools.

Huom. Firefoxin Scratchpad poistettiin Firefox 72:sta (2020). Sen tilalla ovat konsolin monirivitila ja kehittäjätyökalujen Snippets-toiminto sekä palvelut kuten JSFiddle ja CodePen.

JSON-datan tutkimiseen kätevä on JSON editor online.

Web Developer -laajennus

Web Developer on Chris Pederickin selainlaajennus, joka lisää selaimeen oman valikon ja työkalupalkin. Se on edelleen ylläpidetty (Firefox-versio 3.0, kesäkuu 2024) ja saatavilla Firefoxille, Chromelle, Edgelle ja Operalle. Laajennuksessa on useita toimintoja, joita selaimen omista kehittäjätyökaluista ei löydy suoraan.

Asennus: Firefox · Chrome

Asennuksen jälkeen selaimen työkalupalkkiin ilmestyy hammasratasikoni, jota klikkaamalla valikko aukeaa.

Tarkista aina oman versiosi valikot. Laajennus on kirjoitettu kahdesti kokonaan uudelleen (versiot 2.0 vuonna 2017 ja 3.0 vuonna 2024), ja uudelleenkirjoitusten yhteydessä osa vanhoista toiminnoista on kadonnut. Verkosta löytyvät ohjeet ovat usein vuosia vanhoja ja kuvaavat toimintoja, joita ei enää ole. Ajantasainen luettelo löytyy laajennuksen omasta versiohistoriasta.

Validointi

Tools-valikosta löytyvät valmiit validaattorit:

Uusimmissa versioissa Tools-valikkoon voi lisätä myös omia ulkoisia työkaluja ja antaa niille pikanäppäimet. Näppäinyhdistelmät löytyvät ja niitä voi muuttaa Options-valikosta.

View Source

View Source -toiminto palasi laajennukseen versiossa 3.0. Se näyttää sivun lähdekoodin ja osaa avata sen myös ulkoisessa editorissa.

Huom. Vanhemmissa Firefox-versioissa laajennuksessa oli erillinen View Generated Source, joka näytti javascriptin muokkaaman rakenteen. Se katosi versiossa 2.0 (2017), kun laajennus kirjoitettiin uudelleen Firefoxin uudelle laajennusrajapinnalle, eikä ole palannut. Dynaamisesti tuotetun rakenteen tarkistamiseen käytetään siis selaimen omia kehittäjätyökaluja, katso alla.

Muita hyödyllisiä toimintoja

Sivun rakenteen tarkistaminen

Selain korjaa rikkinäistä HTML:ää automaattisesti, ja jokainen selain korjaa sitä hieman eri tavalla. Siksi rakennevirhettä ei välttämättä itse huomaa lainkaan: sivu näyttää omalla koneella oikealta, kunnes korjauskyky loppuu tai joku avaa sivun toisella selaimella ja rakenne hajoaa.

Firefox XML-tilassa

Yksinkertaisin ja nopein tapa bongata rakennevirheet on nimetä tiedosto .xhtml-päätteellä ja avata se Firefoxilla. Firefox jäsentää tiedoston tällöin oikealla XML-jäsentimellä, joka pysähtyy heti ensimmäiseen muotovirheeseen ja kertoo rivinumeron. Palaute tulee sekunneissa eikä vaadi mitään asennettavaa. Kurssin tehtäväpohjat ovat tästä syystä .xhtml-muotoisia.

Jotta sama tiedosto toimisi myös HTML-dokumenttina, html-elementin avaustagin on oltava seuraavaa muotoa:

<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">

xmlns-attribuutti on pakollinen XML-jäsennystä varten, ja lang- sekä xml:lang-attribuuteissa on oltava sama arvo, jotta kumpikin jäsennin ymmärtää kielen samoin.

XML-tila on tiukka, ja juuri se on sen hyöty. Muista näiden lisäksi:

Kun sivu tarjoillaan tyyppinä application/xhtml+xml, myös javascript-koodin on noudatettava tiukempia sääntöjä: document.write ei ole olemassa lainkaan, ja innerHTML hyväksyy vain hyvinmuodostuneen fragmentin. Kumpaakaan ei kannata jäädä kaipaamaan — rakenna DOM-solmut document.createElement- ja textContent-kutsuilla, mikä on muutenkin parempi tapa ja suojaa samalla injektiohaavoilta. Moduuliskriptit vaativat XHTML-tilassa lisäksi async="async"-attribuutin, katso alla.

W3C:n validaattori

W3C:n validaattori (nykyisin Nu Html Checker) tarkistaa hyvinmuodostuneisuuden lisäksi myös sen, ovatko elementit sallituissa paikoissa ja onko pakolliset attribuutit annettu. Firefoxin XML-tila ei näistä välitä, joten työkalut täydentävät toisiaan.

Validaattorille voi antaa osoitteen, ladata tiedoston tai liittää koodin tekstikenttään. Web Developer -laajennuksen Tools-valikko tekee tämän puolestasi.

Dynaamisesti tuotetun sivun tarkistaminen

Luentovideo: dynaamisen sivun tarkistaminen. Jos video ei näy, katso se suoraan YouTubesta.

Kun javascript-koodi muokkaa sivun sisältöä, sivu muuttuu dynaamisesti. Mikään ei estä tuottamasta javascriptillä rikkinäistä html-koodia. Tavallinen validointi ei auta, koska validaattori saa käsiinsä vain palvelimelta ladatun staattisen sisällön. Tällä kurssilla juuri tässä virheet syntyvät.

Kokeile eroa itse:

Huomaa, että .html-versio näyttää selaimessa siedettävältä, mutta .xhtml-versio paljastaa ongelman heti.

Tapa 1: kopioi nykyinen DOM

Aja ohjelmaasi siihen tilanteeseen, jonka haluat tarkistaa. Avaa sitten kehittäjätyökalujen Inspector, klikkaa html-elementtiä hiiren oikealla ja valitse Copy → Outer HTML. Liitä tulos validaattorin tekstikenttään.

Tämä on hidas mutta ei vaadi mitään asennettavaa, ja se toimii aina. Sama onnistuu myös konsolista:

copy(document.documentElement.outerHTML);   // vie leikepöydälle

copy() on konsolin oma apufunktio, ei osa javascript-kieltä.

Jos käytät Web Developer -laajennusta, kokeile myös sen Validate Local HTML -toimintoa ja tarkista tuloksesta, näkyvätkö javascriptin tekemät muutokset. Varmin tapa on kuitenkin yllä kuvattu kopiointi, koska silloin tiedät varmasti, mitä validaattorille lähetettiin.

Tapa 2: validointi ohjelmasta käsin

Nu Html Checkerilla on rajapinta, jolle voi lähettää dokumentin ja saada virheet takaisin JSON-muodossa. Näin validoinnin voi tehdä juuri sillä hetkellä, kun sivu on halutussa tilassa:

async function validoi() {
  const lahde = "<!DOCTYPE html>\n" + document.documentElement.outerHTML;

  try {
    const vastaus = await fetch("https://validator.w3.org/nu/?out=json", {
      method: "POST",
      headers: { "Content-Type": "text/html; charset=utf-8" },
      body: lahde
    });
    const tulos = await vastaus.json();

    if (tulos.messages.length === 0) {
      console.log("%cValidointi OK", "color: green");
      return;
    }
    console.table(tulos.messages.map(m => ({
      tyyppi: m.type,
      rivi: m.lastLine,
      viesti: m.message
    })));
  }
  catch (virhe) {
    console.error("Validointi ei onnistunut:", virhe.message);
  }
}

Huomioitavaa:

Tapa 3: kurssin valmiit skriptit

Kurssilla on valmiina kaksi apuskriptiä:

Skriptin voi liittää suoraan omaan sivuunsa lisäämällä head-osaan rivin:

<script src="https://appro.mit.jyu.fi/tools/validator/validator.user.js"
        defer="defer"></script>

Validoinnin voi tämän jälkeen tehdä kutsulla:

Validate();

Validointi tapahtuu asynkronisesti eli tulokset ilmestyvät konsoliin, kun validaattori ehtii työnsä tehdä ja verkko toimia. Oman ohjelman suoritus ei pysähdy odottamaan validointituloksia.

Validaattorin toimintaa voi kokeilla testisivulla, jonka lähdekoodista näkee myös, miten validointia kutsutaan omasta koodista.

Näitä saa käyttää apuna esimerkiksi viikkotehtävässä 3. Tehtävänannossa kielletään kirjoittamasta javascriptia html-sivun sisään, mutta kielto ei koske valmiissa pohjassa olevaa htmlinspectoria eikä validaattoriskriptiä.

Käyttäjäskriptit

Toinen tapa on asentaa skriptit selaimeen käyttäjäskripteinä, jolloin ne toimivat kaikilla valitsemillasi sivustoilla ilman että omaa koodia tarvitsee muuttaa. Tämä on kätevää esimerkiksi vertaisarvioitavan sivun tarkistamiseen. Käyttäjäskriptien hallintaan tarvitaan selainlaajennus:

Älä laita validointiskriptiä toimimaan kaikilla sivustoilla, koska sillä rasittaa W3C:n validaattoria turhaan. Oletuksena skripti validoi users.jyu.fi-palvelimen alla olevat sivut ja kurssilla palautetut viikkotehtävät.

Yhteenveto

Työkalu Mitä tarkistaa Milloin
ESLint editorissa javascript-koodin virheet ja tyyli kirjoittaessa
//@ts-check tyyppivirheet ja kirjoitusvirheet kirjoittaessa
JSHint tehtäväpohjassa javascript-koodin virheet (ei tunne uusinta syntaksia) sivua ladatessa
Firefox + .xhtml HTML:n hyvinmuodostuneisuus sivua avatessa
W3C-validaattori HTML:n rakenteen oikeellisuus ennen palautusta
Web Developer: Validate Local HTML sama, kun sivu ei ole julkisesti näkyvillä ennen palautusta
Inspector: Copy → Outer HTML javascriptin tuottama rakenne ohjelman ajon aikana
Validate() tai Nu-rajapinta javascriptin tuottama rakenne ohjelmallisesti ohjelman ajon aikana
htmlinspector yleiset rakenneongelmat, myös dynaamiset ohjelman ajon aikana
Kehittäjätyökalujen debugger ohjelman logiikka kun jokin ei toimi

Käyttäjien kommentit

Kommentoi Lisää kommentti