Mappe di origine 101

Nel flusso di lavoro moderno di oggi, il codice che produciamo nei nostri ambienti di sviluppo è notevolmente diverso dal codice di produzione, dopo averlo eseguito attraverso la compilazione, la minificazione, la concatenazione o vari altri processi di ottimizzazione.

È qui che entrano in gioco le mappe di origine, evidenziando la mappatura esatta nel nostro codice di produzione con il codice originale. In questo tutorial introduttivo, prenderemo un semplice progetto e lo eseguiremo attraverso vari compilatori JavaScript allo scopo di giocare con le mappe sorgente nel browser.


Cosa sono le mappe di origine?

Le mappe sorgente offrono un modo agnostico per mappare il codice di produzione al codice originale che è stato creato.

Le mappe sorgente offrono un modo agnostico di mappare il codice di produzione al codice originale creato nel proprio ambiente di sviluppo. Quando guardiamo alla fine alla base di codice, generata e preparata per la produzione, diventa molto difficile individuare esattamente dove si trova la mappatura della linea al nostro codice originale. Tuttavia, durante la compilazione, una mappa sorgente memorizza queste informazioni, in modo che, quando si interroga una sezione di linea, restituisca la posizione esatta nel file originale a noi! Questo offre un enorme vantaggio per lo sviluppatore, in quanto il codice diventa quindi leggibile e persino debugabile!

In questo tutorial, utilizzeremo un codice JavaScript e SASS molto semplice, li eseguiremo attraverso vari compilatori e quindi visualizzeremo i nostri file originali nel browser con l'aiuto delle mappe di origine. Vai avanti e scarica i file demo e cominciamo!


browser

Si noti che, durante la stesura di questo articolo, Chrome (versione 23) supporta JavaScript Source Maps e anche SASS Source Maps. Firefox dovrebbe anche ottenere supporto nel prossimo futuro, poiché è attualmente in una fase attiva di sviluppo. Con questa parola di cautela, vediamo ora come possiamo sfruttare le mappe di origine nel browser!

Mappe di origine in Chrome

Innanzitutto, dobbiamo abilitare il supporto in Chrome, utilizzando i seguenti semplici passaggi:

  • Apri gli Strumenti per sviluppatori di Chrome: Visualizza -> Sviluppatore -> Strumenti per sviluppatori
  • Fai clic sull'icona "Impostazioni" nell'angolo in basso a destra
  • Scegli "Generale" e seleziona "Abilita mappe sorgente"

Impostare

Se desideri lavorare con questo tutorial, scarica la demo e apri la directory "start". La struttura dei file e delle directory è piuttosto semplice, con qualche semplice JavaScript in scripts / script.js. Dovresti essere in grado di aprire index.html e persino aggiungere alcuni nomi di colori CSS o valori esadecimali per modificare il colore di sfondo.

 $ albero. ├── index.html ├── script │ ├── jquery.d.ts │ ├── script.coffee.coffee │ ├── script.js │ └── script.typescript.ts └── stili ├─ ─ style.css └── style.sass

Dai un'occhiata ai semplici file di script in plain JavaScript, TypeScript o CoffeeScript. Utilizzando vari compilatori JavaScript, creeremo una versione pronta per la produzione e genereremo le mappe sorgente corrispondenti.

Nelle sezioni seguenti, utilizzeremo cinque diversi modi per generare un compilato e un minisito script.js, insieme alla mappa sorgente associata. Puoi scegliere di testare tutte le opzioni, o semplicemente andare con il compilatore che conosci già. Queste opzioni includono:

  1. Compilatore di chiusura
  2. GruntJS con JSMin
  3. Uglifyjs 2
  4. CoffeeScript e Redux
  5. Dattiloscritto

Opzione A: compilatore di chiusura

Closure Compiler, di Google, è uno strumento per ottimizzare JavaScript. Lo fa analizzando il codice, rimuovendo i bit non pertinenti e quindi minimizzando il resto. Inoltre, può anche generare mappe sorgente.

Utilizziamo i seguenti passaggi per creare una versione ottimizzata di script.js, usando il compilatore Closure:

  1. Scarica l'ultimo compilatore di chiusura.
  2. Trasferisci il file, compiler.jar, nella directory, script.
  3. Passare alla directory, script, dalla riga di comando ed eseguire quanto segue, in modo che sia ottimizzato, pronto per la produzione script.closure.js il file verrà creato:
     java -jar compiler.jar --js script.js --js_output_file script.closure.js
  4. Assicurarsi che index.html è ora collegato con il file appena creato, scripts / script.closure.js, da decommentare l'opzione A.

Quando apriamo index.html all'interno del browser e vai al pannello Sorgente negli strumenti di sviluppo, solo la versione ottimizzata di script.closure.js è referenziato; non abbiamo modo di riportare una relazione al nostro originale, opportunamente rientrata. Successivamente creiamo il file della mappa sorgente eseguendo il seguente comando nel file script directory:

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

Notare che Closure Compiler accetta due opzioni, --create_source_map e --source_map_format, per creare un file di mappa sorgente, script.closure.js.map, con la mappa di origine versione 3. Quindi, aggiungere l'url di mappaggio sorgente alla fine del file di script compilato, script.closure.js, in modo che il file ottimizzato contenga le informazioni sulla posizione della mappa di origine:

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

Ora, quando visualizziamo il progetto nel browser, la directory "scripts", sotto il pannello Sorgente degli strumenti di sviluppo, mostrerà sia il file originale che la versione ottimizzata, script.closure.js. Sebbene il browser utilizzi naturalmente il file ottimizzato a cui originariamente facevamo riferimento index.html, le mappe di origine ci consentono di creare una connessione al file originale.

Inoltre, provalo con i breakpoint per il debug, ma tieni presente che le espressioni e le variabili di watch non sono ancora disponibili con le mappe sorgente. Speriamo che lo saranno in futuro!


Opzione B: GruntJS Task for JSMin

Se usi già Grunt.js per i processi di compilazione, il plugin Grunt per le mappe di sorgenti JSMin ti tornerà utile. Non solo ottimizzerà il tuo codice, ma creerà anche la mappa sorgente!

I seguenti passaggi mostreranno come creare una versione ottimizzata di script.js con il plugin Grunt JSMin:

  1. installa Grunt.js e avvia un gruntfile, grunt.js, nella radice della directory "start":
     $ npm install -g grunt $ npm visualizza versione grunt npm http GET https://registry.npmjs.org/grunt npm http 200 https://registry.npmjs.org/grunt 0.3.17 $ grunt init: gruntfile
  2. Installa il plugin Grunt grunt-jsmin-sourcemap; quando lo fai, una directory, chiamato node_modules / grugnito-JSMin-Sourcemap sarà creato:
     $ npm installa grunt-jsmin-sourcemap
  3. Modifica il nuovo creato grunt.js file per contenere solo il JSMin-Sourcemap compito - per mantenere le cose il più semplice possibile.
     module.exports = function (grunt) grunt.loadNpmTasks ('grunt-jsmin-sourcemap'); grunt.initConfig ('jsmin-sourcemap': all: src: ['scripts / script.js'], dest: 'scripts / script.jsmin-grunt.js', destMap: 'scripts / script.jsmin- grunt.js.map '); grunt.registerTask ('default', 'jsmin-sourcemap'); ;
  4. Torna alla riga di comando ed esegui grugnito; questo eseguirà l'attività jsmin-sourcemap, poiché l'attività predefinita è dichiarata come tale all'interno del file grunt.js:
     $ grunt Esecuzione dell'attività "jsmin-sourcemap: all" (jsmin-sourcemap) Fatto, senza errori.
  5. Nel file della mappa sorgente appena creato, script.grunt-jsmin.js.map, assicurati che la fonte sia "fonti": [ ""] script.js.
  6. Decommentare l'opzione B per collegarsi al file appena creato, script.grunt-jsmin.js, entro index.html, e aprire nel browser.

Con Grunt e il plugin, jsmin-sourcemap, il processo di compilazione ha creato due file: il file di script ottimizzato con l'url di mappatura di origine nella parte inferiore, oltre a una mappa di origine. Avrai bisogno di entrambi questi per vederli tutti nel browser.


Opzione C: UglifyJS

UglifyJS2 è un altro parser JavaScript, minfier e compressore. Simile alle due alternative di cui sopra, UglifyJS2 creerà un file di script ottimizzato, aggiunto con un URL di mappatura dell'origine e un file di mappa di origine che conterrà il mapping al file originale. Per utilizzare UglifyJS, eseguire quanto segue nella riga di comando della directory "start":

  1. Installa il modulo NPM, uglify-js, a livello locale; una directory, chiamata nocde_module / uglify-js, sarà creato.
     $ npm install uglify-js $ npm visualizza uglify-js versione 2.2.3 $ cd scripts /
  2. All'interno della directory "scripts", eseguiremo il comando per creare una versione ottimizzata, oltre a un file sorgente con le opzioni, --fonte-map e --produzione, per dare un nome al file di output.
     uglifyjs --source-map script.uglify.js.map --output script.uglify.js script.js
  3. Infine, assicurati che index.html è correttamente collegato allo script, script.uglify.js

Opzione D: CoffeeScript Redux

Per le precedenti tre opzioni, abbiamo richiesto solo un'ottimizzazione in un'unica fase, dal codice originale al JavaScript ottimizzato. Tuttavia, per le lingue come CoffeeScript, abbiamo bisogno di un processo in due fasi: CoffeeScript> JavaScript> JavaScript ottimizzato. In questa sezione, esploreremo come creare mappe sorgente multilivello con CoffeeScript e il compilatore CoffeeScript Redux.

Passaggio 1: CoffeeScript to plain JavaScript

Passare alla directory, "start", nella riga di comando. Nei seguenti passaggi, mapperemo il file di script ottimizzato su CoffeeScript:

  1. Installa CoffeeScript come pacchetto globale di npm
  2. Compilare il file CoffeeScript, script.coffee.coffee, per creare una semplice versione JavaScript, utilizzando il seguente comando:
     $ caffè -c script / script.coffee.coffee
  3. Installa CoffeeScript Redux:
     $ git clone https://github.com/michaelficarra/CoffeeScriptRedux.git coffee-redux $ cd coffee-redux $ npm installa $ make -j test $ cd ... 
  4. Successivamente, creeremo un file di mappa sorgente, script.coffee.js.map, che manterrà le informazioni di mappatura dal JavaScript generato al file CoffeeScript:
     $ coffee-redux / bin / coffee --source-map -i script / script.coffee.coffee> script / script.coffee.js.map
  5. Assicurati che il file JavaScript generato, script.coffee.js, ha l'url di mappatura sorgente proprio alla fine con la seguente riga:
     // @ sourceMappingURL = script.coffee.js.map
  6. Assicurarsi che il file della mappa di origine, script.coffee.js.map, ha il file di riferimento corretto come "File": "script.coffee.coffee", e file sorgente come "fonti": [ ""] script.coffee.coffee

Passaggio 2: JavaScript semplice a JavaScript minisito

  1. Infine, useremo ancora UglifyJS per minimizzare il codice JavaScript generato e per creare una mappa sorgente. Questa volta, prenderà una mappa sorgente in modo che possiamo fare riferimento al file CoffeeScript originale. Esegui il seguente comando nella directory "scripts":
     $ cd scripts / $ uglifyjs script.coffee.js -o script.coffee.min.js --source-map script.coffee.min.js.map --in-source-map script.coffee.js.map
  2. Infine, assicurati che il file della mappa sorgente, script.coffee.min.js.map, ha il file di riferimento corretto come "file": "script.coffee.min.js", e le fonti corrette come "fonti": [ ""] script.coffee.coffee.

Opzione E: TypeScript

TypeScript, proprio come CoffeeScript, richiede anche un processo in due passaggi: TypeScript> Plain JavaScript> Minified JavaScript. Poiché lo script utilizza un plugin jQuery, abbiamo bisogno di due file TypeScript, che sono già forniti: script.typescript.ts e jquery.d.ts.

Passaggio 1: da TypeScript a Plain JavaScript

Passare alla directory "scripts" dalla riga di comando ed eseguire il seguente comando:

 $ tsc script.typescript.ts -sourcemap

Il comando precedente creerà un nuovo file JavaScript, chiamato script.typescript.js, con l'url di mappatura sorgente in basso: // @ sourceMappingURL = script.typescript.js.map. Con questo singolo comando, creerà anche il file di mappa, script.typescript.js.map.

Passaggio 2: JavaScript semplice a JavaScript minisito

Come con l'esempio di CoffeeScript, il passo successivo è usare UglifyJS.

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

Infine, assicurati che index.html collegamenti al file di script corretto, scripts / script.typescript.min.js, e aprilo nel browser!


Mappe di origine per SASS

Al di là di JavaScript, al momento, Chrome supporta anche mappe sorgente SASS o SCSS. Per la mappatura delle sorgenti SASS, modifichiamo alcune impostazioni in Chrome, quindi compili SASS in CSS con i parametri di debug:

  1. Prima di modificare qualsiasi impostazione, noterai che, dopo aver ispezionato un elemento dagli strumenti di sviluppo, ci mostrerà solo il riferimento al file CSS. Questo non è troppo utile.
  2. Vai a chrome: // flag /.
  3. Abilita esperimenti sugli strumenti per gli sviluppatori.
  4. Apri Strumenti di sviluppo> Impostazioni> Esperimenti> Verifica "Supporto per SASS".
  5. Compilare SASS con i seguenti parametri di debug nella directory "styles". Ciò anteporrà ciascun set di regole CSS @media -sass-debug-info che avrà le informazioni sul nome file e il numero di riga.
     $ cd stili / $ sass --debug-info --watch style.sass: style.css
  6. Assicurati di riavviare gli strumenti per sviluppatori e aggiorna la pagina.
  7. Ora, quando ispezioniamo un elemento, possiamo accedere al file SASS originale!

Oltre a visualizzare semplicemente il file SASS, se si esegue LiveReload in background e si apportano modifiche al file SASS, la pagina verrà aggiornata anche per riflettere le modifiche. Ad esempio, apriamo il progetto in Firefox e ispezioniamo la pagina, usando l'estensione Firebug.


Informazioni all'interno di una mappa sorgente

Se vediamo uno qualsiasi dei *.carta geografica file, conterrà le informazioni di mappatura dal file originale al file ottimizzato. La struttura di una mappa di origine è in genere nel formato JSON, utilizzando le specifiche della Versione 3. Di solito contiene le seguenti cinque proprietà:

  1. versione: Numero di versione della mappa sorgente - in genere "3."
  2. file: Nome del file ottimizzato.
  3. fonti: Nomi dei file originali.
  4. nomi: Simboli utilizzati per la mappatura.
  5. mappature: Mappatura dei dati.

Risorse addizionali

Le mappe di origine sono ancora in fase di sviluppo attivo, ma, già, ci sono alcune grandi risorse disponibili sul web. Assicurati di considerare quanto segue, se desideri saperne di più.

  • Introduzione alle mappe sorgente JavaScript di Ryan Seddon, HTML5 Rocks
  • The Breakpoint Episode 3: JavaScript Source Maps del team degli sviluppatori di Google
  • The Breakpoint Episode 2: SESS Source Maps del team degli sviluppatori di Google
  • Mappe di origine wiki su lingue, strumenti, articoli su Mappe di origine
  • Mappe sorgente a più livelli con CoffeeScript e TypeScript di Ryan Seddon
  • Fonte Maps Versione 3 proposta

Conclusione

Spero che il precedente walk-through, utilizzando più compilatori, abbia dimostrato il potenziale delle mappe sorgente. Sebbene la funzionalità al momento sia limitata, si spera, in futuro, avremo funzionalità di debug completo, incluso l'accesso a variabili ed espressioni.