Site Overlay

ES6-modules begrijpen

vóór ES6 had Javascript modulebesturingssystemen zoals RequireJS, CommonJS en Angular ‘ s dependency injection system. Andere tools zoals Browserify en Webpack zelf hebben veel problemen in deze context opgelost.

in 2015 hadden we een eerste implementatie van het module systeem in Vanilla Javascript voor Node.js met behulp van de require weten we allemaal. Maar dit is nog niet aangekomen voor browsers.

strikte modus

voor alles moeten we een beetje praten over strikte modus., Zonder dat kunnen we absoluut niets over modules praten.

strict mode is standaard ingeschakeld wanneer we werken met ES6 modules, als je nog steeds niet weet wat strict mode is, zal ik een basis introductie geven.,ad6″>, in de aanroep van de methoden is niet langer gedwongen om een Object

  • het is Niet mogelijk om te gebruiken fn.caller en fn.arguments, om toegang te krijgen tot de stapel, JavaScript
  • van gereserveerde Woorden (zoals protected static interface) niet te lijden hebben van de bind
  • Als u haven ‘ t got a clue, je wordt verondersteld om te gebruiken in de 'use strict', in de juiste plaatsen, het wordt steeds meer de standaard in ES6, het is nog steeds een goede gewoonte om iedere keer te gebruiken.,

    Export

    No modelo CommonJS podemos exportar valores atribuindo eles ao module.exports como no snippet abaixo:

    Sintaxe atual

    No ES6, os módulos são arquivos que dão export uma API (basicamente igual ao CommonJS)., De declaraties, variabelen, functies en alles van die module bestaan alleen in de scopes van die module, wat betekent dat elke variabele die binnen een module is gedeclareerd niet beschikbaar is voor andere modules (tenzij ze expliciet worden geëxporteerd als onderdeel van de API, en later geïmporteerd in de module die ze gebruikt).,

    Export standaard

    u Kunt het simuleren van het gedrag van een CommonJS in principe, het vervangen van de module.exports met een export default:

    de Syntax-module

    aan De andere kant van de modules in CommonJS, de verklaringen in de export, kan alleen geplaatst worden op het hoogste niveau van je code, en niet in welk deel van het., We gaan ervan uit dat deze beperking bestaat om het leven gemakkelijker te maken voor tolken wanneer ze modules gaan identificeren, maar als we er naar kijken, is het een zeer geldige beperking, omdat er niet veel goede redenen voor ons zijn om dynamische exports te definiëren binnen onze API-functies.

    een andere reden hiervoor is te vinden in het gesprek van onze goede vriend William Grasel tijdens Intercon 2017, op web app performance (die hier te vinden is).,

    hij zegt dat een van de manieren om de prestaties uit te breiden is door het gebruik van modules, Dit is omdat de modules statisch gecompileerd zijn, en voordat je code zelfs naar de browser interpreter gaat (zoals V8 bijvoorbeeld). Op deze manier is het mogelijk om alleen de delen van de code die daadwerkelijk worden gebruikt in de applicatie te extraheren in plaats van de hele module te importeren, en dit zou alleen mogelijk zijn als de modules op het hoogste niveau werden gedeclareerd, omdat alles binnen een functie iets dynamisch zou worden, niet statisch.,

    named Exports

    in CommonJS kunnen we eenvoudig variabele bindingen maken direct in demodule.exports, die dan de eigenschappen in real time bijgewerkt zullen hebben:

    module.exports.foo = 'bar'

    we kunnen dit gedrag repliceren met named exports syntaxis. In plaats van de waarde toe te wijzen aan module.exports, kunnen we alle variabelen declareren die we willen exporteren.,

    Let op dat de code hieronder wordt niet herwerkt om het ophalen van de declaratie van een variabele naar een enkele rij (en dan gebruiken in een export foo), het geeft ons een fout in de syntaxis, hoewel, meer en meer ES6 voor statische analyse in plaats van de kasstromen, dynamische:

    export var foo = 'bar'

    het Is belangrijk om in gedachten te houden dat we exportanto bindings, er zijn geen waarden.

    Bindingen., Geen waarden

    een belangrijk punt om op te merken is dat modules in ES6 geen waarden of referenties exporteren, maar eerder de bindingen van variabelen. Dit betekent in de praktijk dat een variabele met de naam foo, die wordt geëxporteerd, een link zal hebben naar de module foo variabele, en de waarden die eraan worden toegewezen zullen onderhevig zijn aan de waardewijzigingen die worden aangebracht in foo.,=”ef1b1c4fb0″>,

    , en het Exporteren van lijsten

    Zoals je hieronder kunt zien, zijn de modules in ES6 laat exportemos de lijsten van de leden aangewezen om het hoogste niveau:

    lijsten Exporteren

    Als u wilt exporteren naar iets met een andere naam kunt u gebruik maken van de export { foo as fuz }, zoals hieronder weergegeven:

    in Aanvulling op deze, kunt u aangeven dat iets als dit default, wanneer de lijsten worden genoemd., De onderstaande code is hetzelfde als het doen van een export default foo en na de export bar, maar het is in een unieke positie:

    export { foo as default, bar }

    Het is echter een goed idee om gewoon een export default aan het einde van het bestand.

    Best practices in lijn met de export

    alle mogelijkheden om de module te exporteren zullen nogal wat verwarring in de hoofden van de mensen veroorzaken. In de meeste gevallen wordt aangeraden om alleen een export default te gebruiken (en dit alleen aan het einde van de module te doen)., Dan kunt u de API importeren als de naam van de module zelf.

    De voordelen zijn:

    • de interface die wordt geëxporteerd wordt heel duidelijk, in plaats van te zoeken naar waar we de interface in de module exporteren.
    • u maakt geen verwarring over waar u een export default of een named export (of een lijst van named exports) moet gebruiken. Probeer vast te houden aan deexport default
    • consistentie. In CommonJS is het normaal om een enkele methode in een module te gebruiken., Dit doen met named exports is onmogelijk omdat u een object met een methode erin zult blootstellen, tenzij u deas default gebruikt in deexport lijst. Heb al de export default, wat het meest veelzijdig is, omdat je maar één ding kunt exporteren.
    • gebruik de

    wordt import sneller

    Import

    import, die de tegenhanger is in de export, Het kan ook worden gebruikt om te laden een module van de andere.,

    allereerst hangt de manier waarop modules worden geladen af van de implementatie van elke plaats. Op dit moment geen browser implementeert een loader.

    om te omzeilen wat hierboven werd gezegd, is het mogelijk om bronnen zoals transpilers (zoals Babel) te gebruiken om ES6-code te schrijven, terwijl de ontwikkelingsteams van de browsers zich zorgen maken over hoe het laden van modules werkt.

    een cool voorbeeld is de lodash., De volgende regel laadt de lodash library eenvoudig in onze module. Echter, het maakt geen variabelen. Het zal elke code uitvoeren op het hoogste niveau van Lodash.

    import 'lodash'

    voordat we verder gaan, een snelle opmerking:

    import net als de export is alleen toegestaan op het hoogste niveau van de module, en niet binnen andere scopes, waarschijnlijk om dezelfde redenen als ik hierboven zei.,

    importeren defaults

    in CommonJS hebben we een import met require:

    var _ = require('lodash')

    om een export default uit een andere module met ES6 we je hoeft maar één naam te kiezen. De syntaxis verandert een beetje omdat je het object zelf niet importeert, maar een binding., En dit maakt het gemakkelijk voor analyse:

    import _ from 'lodash'

    ongeacht de export de benoemde

    de syntaxis is zeer vergelijkbaar met de hierboven gebruikte:

    import { map, reduce } from 'lodash'

    Het is zeer vergelijkbaar met de destructuring toewijzing, die we in de nieuwe specificatie.,de naam importeert, met export naar normen zonder het gebruik van de sleutels (maar, helaas, je bent niet van plan om een alias te geven aan hen.

    alle

    zie de invoer van patronen aan de buitenkant van de sleutel.

    Importeren van alle

    Als u wilt importeren in de naamruimte van een module., In tegenstelling tot de genoemde imports of defaults, importeert het alles.

    merk op dat de syntaxis hieronder moet worden gevolgd door een alias waar alle bindingen zullen worden geplaatst. (Export naar normen te worden geplaatst in de alias.default):

    import * as _ from 'lodash'

    bindende _.default is de inhoud van de export default LoDash

    Conclusie

    Zorg ervoor dat u meer van mijn inhoud op mijn blog, en meld je aan voor de nieuwsbrief en ontvang wekelijks nieuws!,

    hiermee sluiten we een andere gids op ES6! Ik beveel het lezen van meer inhoud over het onderwerp, en ook verdieping, want dit is een spec die is te komen in alle browsers en moet worden gebruikt om alles wat we vandaag hebben te optimaliseren!,

    een Paar middelen bacanas são:

    • Livro cangaceiro JavaScript
    • Livro SS6
    • Cursus SS6 doen William Justen
    • Cursus SS6 com Webpack doen José Bernardo Cunha
    • PonyFoo (de onde eu tirei muito doen materiaal deste artigo, voornamelijk os exemplos)
    • Pagina MDN op importeren
    • Blog 2ality op modules (de onde veio também algum materiaal deste artigo)
    • Livro ExploringJS
    • SitePoint op modules

    Geef een reactie

    Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *