2016-03-19 14 views
15

Attualmente sto imparando Meteor e ho scoperto qualcosa che mi ha incuriosito.Utilizzo di ES6 `import` con i file CSS/HTML nel progetto Meteor: bug o funzionalità?

È possibile caricare risorse HTML e CSS da un file JS utilizzando l'istruzione import.

import '../imports/hello/myapp.html'; 
import '../imports/hello/myapp.css'; 
import * as myApp from '../imports/hello/myapp.js'; 

Questa è stata una sorpresa per me, così mi sono imbattuto a google ma non ho trovato questo comportamento documentato nella specifica per ES6 import o in Documenti di Meteor.

Quindi le mie domande sono:

  • Posso contare su questo comportamento per costruire le mie applicazioni?
  • La mia app si romperà quando Meteor si aggira per risolvere il problema - se si tratta di un bug -?

Note

  • Sto usando Meteor v1.3, non so se questo funziona anche con le versioni precedenti.
  • È possibile scaricare l'applicazione per vedere questo comportamento da Github
+2

Perché stai importando CSS e HTML in file JavaScript? Non hai bisogno di farlo in Meteor. –

+0

Certo, ci sono altri modi per ottenere lo stesso. La domanda rimane, è un bug o una funzionalità? –

+0

Dove sei, Meteor community? Vieni e prendi questa taglia per favore !!! –

risposta

13

Dopo aver esaminato l'implementazione dei file creati per la mia app ho scoperto perché questo funziona.

HTML

file vengono letti dal file system e il loro contenuto aggiunto all'oggetto Modello globale, per esempio,

== myapp.html == 

<body> 
    <h1>Welcome to Meteor!</h1> 
    {{> hello}} 
</body> 

risultati nel seguente codice JS:

Template.body.addContent((function() {                  
    var view = this;                       
    return [ 
    HTML.Raw("<h1>Welcome to Meteor!</h1>\n\n "),  
    Spacebars.include(view.lookupTemplate("hello")) 
    ]; 
}));                           

che è avvolto in una funzione con il nome del file in quanto è fondamentale:

"myapp.html": function (require, exports, module) { 

    Template.body.addContent((function() {                  
      var view = this;                       
      return [ 
      HTML.Raw("<h1>Welcome to Meteor!</h1>\n\n "), 
      Spacebars.include(view.lookupTemplate("hello"))]; 
    })); 

    Meteor.startup(Template.body.renderToDocument);                

    Template.__checkName("hello");                    
    Template["hello"] = new Template("Template.hello", (
     function() {            
      var view = this;                       
      return [ 
       HTML.Raw("<button>Click Me</button>\n "), 
       HTML.P("You've pressed the button ", 
         Blaze.View("lookup:counter", 
         function() { 
         return Spacebars.mustache(view.lookup("counter"));             
         }), " times.") 
      ];                       
    }));                           

}, 

Quindi tutto il nostro HTML è ora puro codice JS che verrà incluso utilizzando require come qualsiasi altro modulo.

CSS

I file vengono anche letti dal file system e il loro contenuto sono integrati anche nelle funzioni JS, per esempio

== myapp.css == 

/* CSS declarations go here */ 

body { 
    background-color: lightblue; 
} 

si trasforma in:

"myapp.css": ["meteor/modules", function (require, exports, module) { 
    module.exports = require("meteor/modules").addStyles("/* CSS declarations go here */\n\nbody {\n background-color: lightblue;\n}\n"); 

}] 

Quindi tutto il nostro CSS è ora anche un modulo di JS che è ancora una volta importati in seguito utilizzando require.

Conclusione

Tutti i file sono in un modo o nell'altro convertiti in moduli JS che seguono regole simili per l'inclusione come moduli AMD/CommonJS. Verranno inclusi/raggruppati se un altro modulo fa riferimento ad essi. E dal momento che tutti sono trasformati in codice JS non c'è nessuna magia dietro la sintassi ingannevole:

import '../imports/hello/myapp.html'; 
import '../imports/hello/myapp.css'; 

Entrambi sono transpiled alle loro forme equivalenti con require una volta che i beni sono stati trasformati ai moduli JS.

Considerando che l'approccio di collocazione delle risorse statiche nella directory imports non è menzionato nella documentazione ufficiale, , questo metodo di importazione delle risorse statiche funziona.

Questo sembra essere al centro di come funziona Meteor, quindi scommetto che questa funzionalità sarà lì per un lungo periodo.

Non so se chiamare questa funzione, forse una descrizione più appropriata è una conseguenza inaspettata ma che sarebbe solo dal punto di vista dell'utente, presumo che le persone che hanno scritto il codice abbiano capito che ciò sarebbe accaduto e forse anche progettato appositamente in questo modo.

+1

solo per curiosità, dove hai trovato questi codici HTML/CSS compilati? –

+1

'.meteor/local/build/programs/web.browser/app/app.js' –

+1

puoi rilasciare il' ..' nei tuoi '../import' apparentemente puoi usare '/ imports/...' quindi non è necessario tenere traccia di quanti livelli sono in corso. –

0

ES6 esportazione e l'importazione di vista funzionale sono disponibili in Meteor 1.3. Non dovresti importare file HTML e CSS se stai usando Blaze, l'attuale modello predefinito di enginge. La funzionalità di importazione/esportazione è presente, ma potresti utilizzare l'approccio sbagliato per la creazione delle visualizzazioni.

+0

Ora so che questo non è l'approccio standard. La domanda rimane: bug o funzionalità? –

+0

Né? Puoi importare ed esportare. Qual è l'errore? –

+0

La ragione per cui ho posto la domanda è che non mi sarei mai aspettato di poter includere file HTML e CSS usando la parola chiave 'import'. E come la domanda dice che non ho ancora trovato alcun documento che spieghi questo comportamento.Mi piace il fatto che io possa importare esplicitamente qualsiasi risorsa invece di doverli posizionare in luoghi speciali e quindi fare affidamento sul meccanismo di caricamento magico ed è per questo che vorrei sapere se questo comportamento sarà sempre presente o sarà disabilitato in alcuni casi punto in futuro. –

2

Una delle funzionalità di Meteor 1.3 è il caricamento lento in cui i file vengono posizionati nella cartella /imports e non verranno valutati in modo impaziente.

Citazione di Guida Meteor:

Per utilizzare appieno il sistema modulare e garantire che il nostro codice viene eseguito solo quando lo chiediamo a, si consiglia di tutto il codice dell'applicazione dovrebbe essere posto all'interno della importazioni/directory. Ciò significa che il sistema di costruzione Meteor impacchetterà e includerà quel file solo se viene fatto riferimento da un altro file utilizzando l'importazione da .

Così puoi caricare pigro i file css importandoli dalla cartella /imports. Direi che è una caratteristica.

+0

Questo non spiega perché siamo in grado di importare risorse statiche come file CSS e HTML. –

+0

Caricamento lento, moduli css, jss, ecc. Ecco perché è necessario importare css nei file js. Non sono sicuro di quale sia il caso d'uso per le importazioni HTML. – sammkj