Källkartor 101

I dagens moderna arbetsflöde är koden som vi författar i våra utvecklingsmiljöer väsentligt annorlunda än produktionskoden, efter att den körts genom kompilering, minifiering, sammanlänkning eller olika andra optimeringsprocesser.

Det här är källakartor som spelas in, genom att påpeka den exakta kartläggningen i vår produktionskod till den ursprungliga författade koden. I den här inledande handledningen tar vi ett enkelt projekt och kör det genom olika JavaScript-kompilatorer för att spela med källkartor i webbläsaren.


Vad är källkartor?

Källkartor erbjuder ett språk-agnostiskt sätt att kartlägga produktionskoden till den ursprungliga koden som var författad.

Källkartor erbjuder ett språk-agnostiskt sätt att kartlägga produktionskoden till den ursprungliga koden som var författad i din utvecklingsmiljö. När vi äntligen tittar på kodbasen, genererad och förberedd för produktion, blir det mycket utmanande att lokalisera exakt var linjekartläggningen till vår ursprungliga författad kod är. Under sammanställningen lagras emellertid en källkarta den här informationen, så att vi, när vi frågar en linjesektion, returnerar den exakta platsen i originalfilen till oss! Detta ger en stor fördel för utvecklaren, eftersom koden då blir läsbar - och även debuggbar!

I den här handledningen tar vi en mycket enkel bit av JavaScript och SASS-koden, kör dem genom olika kompilatorer och sedan se våra ursprungliga filer i webbläsaren med hjälp av källkartor. Gå vidare och ladda ner demofilerna och låt oss komma igång!


webbläsare

Observera att Chrome (Version 23) stöder JavaScript-källkartor och även SASS-källkartor när du skriver den här artikeln. Firefox bör också få stöd inom en snar framtid, eftersom den för närvarande befinner sig i ett aktivt utvecklingsstadium. Med det försiktighetssöket ur vägen, låt oss nu se hur vi kan utnyttja källkartor i webbläsaren!

Källkartor i Chrome

Först måste vi aktivera stöd i Chrome med följande enkla steg:

  • Öppna Chrome Developer Tools: Visa -> Utvecklare -> Utvecklarverktyg
  • Klicka på knappen "Inställningar" i det nedre högra hörnet
  • Välj "Allmänt" och välj "Aktivera källkartor"

Inrätta

Om du vill arbeta tillsammans med denna handledning, ladda ner demo och öppna "start" -katalogen. Filerna och katalogstrukturen är ganska grundläggande, med några enkla JavaScript in scripts / script.js. Du borde kunna öppna index.html och till och med lägga till några CSS-färgnamn eller hex-värden för att ändra bakgrundsfärgen.

 $ träd. ├── index.html ├── scripts │ ├── jquery.d.ts │ ├── script.coffee.coffee │ ├── script.js │ └── script.typescript.ts └── stilar ├─ ─ style.css └── style.sass

Titta igenom de enkla skriptfilerna i vanlig JavaScript, TypeScript eller CoffeeScript. Med hjälp av olika JavaScript-kompilatorer skapar vi en produktionsklar version, samt genererar motsvarande källkartor.

I följande avsnitt använder vi fem olika sätt att generera en sammanställd och minifierad script.js, tillsammans med tillhörande källkarta. Du kan antingen välja att testa alla alternativ, eller helt enkelt gå med kompilatorn som du redan är bekant med. Dessa alternativ inkluderar:

  1. Closure Compiler
  2. GruntJS med JSMin
  3. Uglifyjs 2
  4. CoffeeScript och Redux
  5. MASKINSKRIVEN

Alternativ A: Closure Compiler

Closure Compiler, av Google, är ett verktyg för att optimera JavaScript. Det gör det genom att analysera din kod, ta bort irrelevanta bitar och sedan minska resten. Utöver det kan det också skapa källkartor.

Låt oss använda följande steg för att skapa en optimerad version av script.js, med hjälp av Closure-kompilatorn:

  1. Ladda ner den senaste Closure kompilatorn.
  2. Överför filen, compiler.jar, till katalogen, skript.
  3. Navigera till katalogen, skript, från kommandoraden, och kör följande, så att en optimerad, produktionsklar script.closure.js filen kommer att skapas:
     java -jar compiler.jar --js script.js --js_output_file script.closure.js
  4. Se till att index.html är nu länkad till den nyskapade filen, scripts / script.closure.js, genom att inte kommentera Alternativ A.

När vi öppnar index.html i webbläsaren och navigera till källpanelen i utvecklingsverktygen, bara den optimerade versionen av script.closure.js hänvisas; Vi har ingen möjlighet att göra en relation tillbaka till vårt original, ordentligt indragna. Låt oss nu skapa källkartfilen genom att utföra följande kommando i skript katalogen:

 java -jar compiler.jar --js script.js --create_source_map script.closure.js.map --source_map_format = V3 --js_output_fil script.closure.js

Observera att Closure Compiler tar två alternativ, --create_source_map och --source_map_format, för att skapa en källkartafil, script.closure.js.map, med källkortsversion 3. Lägg sedan till källkartläggningsadressen till slutet av den sammanställda skriptfilen, script.closure.js, så att den optimerade filen innehåller källkarta platsinformation:

 // @ sourceMappingURL = script.closure.js.map

Nu, när vi tittar på projektet i webbläsaren, visar "skript" -katalogen under källpanelen i utvecklarverktygen både den ursprungliga filen och den optimerade versionen, script.closure.js. Även om webbläsaren förstås använder den optimerade filen som vi ursprungligen refererade till index.html, källkartor tillåter oss att skapa en anslutning till den ursprungliga filen.

Också, prova det med brytpunkter för debugging, men kom ihåg att klockuttryck och variabler inte är tillgängliga med källkartor. Förhoppningsvis kommer de att vara i framtiden!


Alternativ B: GruntJS-uppgift för JSMin

Om du redan använder Grunt.js för byggprocesser kommer Grunt-plugin-programmet för JSMin-källkartor att vara till nytta. Det kommer inte bara att optimera din kod, men det kommer även att skapa källkartan!

Följande steg visar hur man skapar en optimerad version av script.js med Grunt JSMin-plugin:

  1. installera Grunt.js och starta en gruntfil, grunt.js, i roten till "start" -katalogen:
     $ npm installera -g grunt $ npm visa grunt version npm http GET https://registry.npmjs.org/grunt npm http 200 https://registry.npmjs.org/grunt 0.3.17 $ grunt init: gruntfile
  2. Installera Grunt-plugin-grunt-jsmin-sourcemap; när du gör det, en katalog som heter node_modules / grunt-JSMin-sourcemap kommer att skapas:
     $ npm installera grunt-jsmin-sourcemap
  3. Redigera den nyskapade grunt.js fil för att bara innehålla JSMin-sourcemap uppgift - att hålla saker så enkla som möjligt.
     module.exports = funktion (grunt) grunt.loadNpmTasks ('grunt-jsmin-sourcemap'); grunt.initConfig ('jsmin-sourcemap': alla: src: ['scripts / script.js'], dest: 'scripts / script.jsmin-grunt.js', destMap: 'scripts / script.jsmin- grunt.js.map '); grunt.registerTask ('default', 'jsmin-sourcemap'); ;
  4. Återgå till kommandoraden och kör grymta; Detta kommer att utföra uppgiften jsmin-sourcemap, eftersom standarduppgiften anges som sådan inom grunt.js-filen:
     $ grunt Running "jsmin-sourcemap: all" (jsmin-sourcemap) uppgift Gjord utan fel.
  5. I den nyskapade källkartfilen, script.grunt-jsmin.js.map, se till att källan är "källor": [ "script.js"].
  6. Okomment alternativ B att länka till den nyskapade filen, script.grunt-jsmin.js, inom index.html, och öppna i webbläsaren.

Med Grunt och plugin, jsmin-sourcemap, skapade byggprocessen två filer: den optimerade skriptfilen med källkartläggningsadressen längst ner, liksom en källkarta. Du behöver båda dessa för att kunna se dem alla i webbläsaren.


Alternativ C: UglifyJS

UglifyJS2 är en annan JavaScript-parser, minfier och kompressor. I likhet med de två alternativen ovan kommer UglifyJS2 att skapa en optimerad skriptfil, bifogad med en källkartläggningsadress och en källkartfil som innehåller mappningen till originalfilen. För att använda UglifyJS, kör följande i kommandoraden i "start" -katalogen:

  1. Installera NPM-modulen, uglify-js, lokalt; en katalog som heter nocde_module / uglify-js, kommer att skapas.
     $ npm installera uglify-js $ npm visa uglify-js version 2.2.3 $ cd skript /
  2. I katalogen "skript" utför vi kommandot för att skapa en optimerad version, liksom en källfil med alternativen, --source-karta och --produktion, för att namnge utdatafilen.
     uglifyjs - källkarta script.uglify.js.map --output script.uglify.js script.js
  3. Slutligen, se till att index.html är korrekt kopplad till skriptet, script.uglify.js

Alternativ D: CoffeeScript Redux

För de tre föregående alternativen behövde vi bara en stegsoptimering, från den ursprungliga koden till den optimerade JavaScript. Men för språk som CoffeeScript behöver vi en tvåstegs process: CoffeeScript> JavaScript> optimerad JavaScript. I det här avsnittet kommer vi att undersöka hur man skapar Multi-Level Source Maps med CoffeeScript och CoffeeScript Redux-kompilatorn.

Steg 1: CoffeeScript till vanlig JavaScript

Navigera till katalogen, "start", i kommandoraden. I följande steg kommer vi att kartlägga den optimerade skriptfilen tillbaka till CoffeeScript:

  1. Installera CoffeeScript som ett globalt npm-paket
  2. Kompilera CoffeeScript-filen, script.coffee.coffee, för att skapa en vanlig JavaScript-version, med följande kommando:
     $ kaffe -c skript / script.coffee.coffee
  3. Installera CoffeeScript Redux:
     $ git klon https://github.com/michaelficarra/CoffeeScriptRedux.git coffee-redux $ cd kaffe-redux $ npm installera $ make -j test $ cd ... 
  4. Därefter kommer vi att skapa en källkartfil, script.coffee.js.map, som kommer att hålla mappinformationen från den genererade JavaScript tillbaka till CoffeeScript-filen:
     $ coffee-redux / bin / coffee -source-map -i scripts / script.coffee.coffee> skript / script.coffee.js.map
  5. Se till att den genererade JavaScript-filen, script.coffee.js, har källkartläggningsadressen till höger i slutet med följande rad:
     // @ sourceMappingURL = script.coffee.js.map
  6. Se till att källkartfilen, script.coffee.js.map, har rätt referensfil som "Fil": "script.coffee.coffee", och källfil som "källor": [ "script.coffee.coffee"]

Steg 2: Placera JavaScript till Miniverad JavaScript

  1. Slutligen använder vi UglifyJS än en gång för att minimera det genererade JavaScript, samt skapa en källkarta. Den här gången kommer den att ta in en källkarta så att vi kan hänvisa till den ursprungliga CoffeeScript-filen. Kör följande kommando i katalogen "skript":
     $ cd skript / $ uglifyjs script.coffee.js -o script.coffee.min.js - källkarta script.coffee.min.js.map - in-source-map script.coffee.js.map
  2. Slutligen, se till att källkartfilen, script.coffee.min.js.map, har rätt referensfil som "Arkiv": "script.coffee.min.js", och rätt källor som "källor": [ "script.coffee.coffee"].

Alternativ E: TypeScript

TypeScript, precis som CoffeeScript, kräver också en tvåstegsprocess: TypeScript> Enkel JavaScript> Miniverad JavaScript. Eftersom skriptet använder ett jQuery-plugin behöver vi två TypeScript-filer, som redan finns: script.typescript.ts och jquery.d.ts.

Steg 1: TypeScript till Plain JavaScript

Navigera till "skript" katalogen från kommandoraden och kör följande kommando:

 $ tsc script.typescript.ts -surkemap

Ovanstående kommando kommer att skapa en ny JavaScript-fil, kallad script.typescript.js, med källkartläggningsadressen längst ner: // @ sourceMappingURL = script.typescript.js.map. Med det här kommandot kommer det också att skapa kartfilen, script.typescript.js.map.

Steg 2: Placera JavaScript till Miniverad JavaScript

Som med CoffeeScript-exemplet är nästa steg att använda UglifyJS.

 $ uglifyjs script.typescript.js -o script.typescript.min.js - källkarta script.typescript.min.js.map - in-source-map script.typescript.js.map

Slutligen, se till att index.html länkar till rätt skriptfil, scripts / script.typescript.min.js, och öppna den i webbläsaren!


Källkartor för SASS

Utöver JavaScript stödjer Chrome för närvarande SASS- eller SCSS-källkartor. För SASS-källkartläggning, låt oss ändra några inställningar i Chrome och sedan kompilera SASS till CSS med felsökningsparametrar:

  1. Innan du ändrar några inställningar, märker du att vid inspektion av ett element från utvecklingsverktyg kommer det bara att visa oss CSS-filreferensen. Detta är inte alltför användbart.
  2. Gå till krom: // flaggor /.
  3. Aktivera experiment i utvecklingsverktyg.
  4. Öppna Dev-verktyg> Inställning> Experiment> Kontrollera "Stöd för SASS".
  5. Kompilera SASS med följande felsökningsparametrar i "stilar" -katalogen. Detta kommer att förordna varje CSS Ruleset med @media-sass-debug-info som kommer att ha information om filnamn och linjenummer.
     $ cd stilar / $ sass --debug-info - watch style.sass: style.css
  6. Var noga med att starta om utvecklarverktygen och uppdatera sidan.
  7. Nu när vi inspekterar ett element, kan vi komma åt den ursprungliga SASS-filen!

Utöver att bara se SASS-filen, om du kör LiveReload i bakgrunden och gör ändringar i SASS-filen, uppdateras sidan för att spegla ändringarna. Till exempel, låt oss öppna projektet i Firefox och inspektera sidan, med Firebug-tillägget.


Information inom en källkarta

Om vi ​​tittar på någon av *.Karta filer kommer den att innehålla mappinformationen från den ursprungliga filen till den optimerade filen. Strukturen för en källkarta är vanligtvis i JSON-formatet, med version 3-specifikationerna. Den innehåller vanligtvis följande fem egenskaper:

  1. version: Versionsnummer för källkartan - vanligen "3."
  2. fil: Namnet på den optimerade filen.
  3. källor: Namnen på de ursprungliga filerna.
  4. namn: Symboler som används för kartläggning.
  5. mappningar: Kartläggning av data.

Ytterligare resurser

Källkartor är fortfarande mycket under aktiv utveckling, men redan finns det några stora resurser tillgängliga på webben. Var noga med att överväga följande om du vill lära dig mer.

  • Introduktion till JavaScript-källkartor av Ryan Seddon, HTML5 Rocks
  • Breakpoint Episode 3: JavaScript-källkartor av Google Developer Team
  • Breakpoint Episode 2: SASS Source Maps av Google Developer Team
  • Källkartor wiki på språk, verktyg, artiklar på källkartor
  • Multi Level Source Maps med CoffeeScript och TypeScript av Ryan Seddon
  • Source Maps Version 3 förslag

Slutsats

Jag hoppas att ovanstående genomgång, med hjälp av flera kompilatorer, har visat potentialen i källkartor. Även om funktionaliteten för närvarande är begränsad, kommer vi förhoppningsvis att i framtiden ha fullständig felsökningsfunktion, inklusive tillgång till variabler och uttryck.