2015-09-29 16 views
5

Sto assemblando un repository che sarà disponibile su npm. Il repository è composto da più moduli, simili a react-leaflet e react-d3. Gli sviluppatori di applicazioni includeranno moduli dal all'interno del pacchetto NPM tramite require/import, ad es .:Includere CSS (Sass) da più moduli

import { ModuleOne, ModuleTwo } from 'myNpmPackage`; 

Ho bisogno di confezionare CSS insieme a ciascuno di questi moduli, e che i CSS verranno compilati dai file Sass all'interno di ogni modulo.

dato una struttura di cartelle per myNpmPackage come:

├── src 
│ ├── ModuleOne 
│ │ ├── index.js 
│ │ ├── style.scss 
│ ├── ModuleTwo 
│ │ ├── index.js 
│ │ ├── style.scss 
├── package.json 

cosa è un buon pubblicare flusso di rendere i file .scss (compilato nel .css) a disposizione dei consumatori di myNpmPackage, senza richiedere che i consumatori in modo esplicito includono/@import/link rel="stylesheet" il CSS?

Sto usando gulp e browserify e preferisco restare con quella pipeline.


UPDATE: ho trovato parcelify fa alcuni di cosa ho bisogno. Aggiungo quanto segue per myNpmPackage/package.json:

"style": "src/**/*.scss", 
"transforms": [ 
    "sass-css-stream" 
] 

e aggiungi parcelify a dependencies, in modo che venga installato insieme a myNpmPackage.

I consumatori di myNpmPackage devono quindi aggiungere il seguente alla loro gulpfile:

parcelify(b, { 
    bundles: { 
     style: './build/modules.css' 
    } 
}); 

parcelify utilizzerà il "style" glob in myNpmPackage/package.json di radunare tutti i file .scss in myNpmPackage s' moduli e distribuirli in ./build/modules.css.

Questo è sempre lì, ma non è l'ideale per due motivi:

  1. I file CSS di ogni modulo sono tutti inclusi nella build dell'applicazione dei consumatori, anche se non tutti i moduli sono inclusi;
  2. Questa strategia richiede allo sviluppatore di applicazioni consumer di aggiungere codice al proprio gulpfile anziché "solo funzionante".
+0

So che si vuole attaccare con browserify ma [webpack] (http://webpack.github.io/) è davvero perfetto per il tuo caso d'uso –

+0

@ JulienCabanès ti dispiacerebbe elaborare? Forse hai più familiarità con il webpack di me e puoi condividere un esempio di come farei questo con il webpack. – ericsoco

risposta

2

Here is a Webpack setup che fa esattamente quello che vi serve:

  • solo importati moduli CSS sono compresi nel the build (ModuleThree non è per esempio).
  • non è necessario aggiornare alcuni gulpfile.js o *.config.js, ogni modulo require its own stylesheet(s) come qualsiasi altra dipendenza.

Bonus: ModuleTwo mostra how to lazy load CSS e contiene anche un'immagine di sfondo che sarà incluso come qualsiasi dipendenza pure.

Nota: Non ho utilizzato la sintassi ES2015 ma è possibile se lo si desidera con babel-loader.

+0

Grazie a @ Julen, è fantastico. Continuerò ad accettare questa risposta dato che preferirei non passare da browserify a webpack ancora ... ma potrei cambiare presto :) – ericsoco

+0

Mi rendo conto che potrei essere un purista, ma non lo sono un fan di inlining del CSS in HTML. Il webpack offre un'opzione per compilare i file CSS/Sass richiesti in un file .css anziché inlining? – ericsoco

+1

Sì, con [questo plugin] (https://github.com/webpack/extract-text-webpack-plugin). Ho [aggiornato] (https://github.com/JulienCabanes/Webpack-Module-Example/commit/71e599e4d4bfe246035a8dbcfa2899e73137d063#diff-11e9f7f953edc64ba14b0cc350ae7b9d) my config e ora ho un singolo [build stylesheet] (https: // github. com/JulienCabanes/Webpack-Module-Example/blob/master/dist/styles.css) (eccetto il carico pigro) che devo [includere manualmente] (https://github.com/JulienCabanes/Webpack-Module-Example/ blob/master/index.html # L3) con un classico tag 'link'. –

1

Dipende in parte dalla propria pipeline di sviluppo. Dopo aver creato la tua app, puoi rendere visibile tutto il tuo SCSS in CSS. Quindi, supponendo che tu abbia un singolo file CSS con tutti gli stili resi, puoi includerlo in un file JavaScript usando vari metodi all'interno dell'ecosistema di gulp, ad esempio this plugin.

function addStyleString(str) { 
    var node = document.createElement('style'); 
    node.innerHTML = str; 
    document.body.appendChild(node); 
} 

addStyleString('/* CSS File 1 */'); 

E nel tuo sorso cantiere:

var gfi = require("gulp-file-insert"); 

gulp.src('./sample.js') 
    .pipe(gfi({ 
    "/* CSS File 1 */": "path/to/main.css" 
    })) 
    .pipe(gulp.dest('./dist/')); 

Riferimento: Inject CSS stylesheet as string using Javascript

+0

Non sono sicuro che mi senta a mio agio su tutto il CSS-inlined-into-JS thing, a la Radium. Ma grazie per il suggerimento. – ericsoco