2016-06-23 22 views
5

Sto cercando di rimuovere i tag di script per le librerie javascript dal mio html e così ho rimosso underscore.js da una pagina di modello.Importare la libreria Javascript in tutto il mondo tramite Webpack

di sostituire questo, dentro le mie index.js (webpack punto di ingresso), ho il seguente

import 'underscore'; 

La dimensione del webpack emesso bundle.js aumenta di file da 50k quando faccio questo, così ho sappi che la libreria è in bundle.js. Tuttavia, il carattere di sottolineatura non è disponibile quando provo ad usarlo nella console su una pagina che include bundle.js.

Ogni pensiero sarebbe apprezzato.

const webpack = require('webpack'); 
const path = require('path'); 
const precss = require('precss'); 
const autoprefixer = require('autoprefixer'); 
const ExtractTextPlugin = require('extract-text-webpack-plugin'); 
const postcssImport = require('postcss-import'); 

module.exports = { 

    context: __dirname + '/frontend', 
    devtool: 'source-map', 
    entry: './index.js', 
    output: { 
    filename: 'bundle.js', 
    path: path.join(__dirname, './static'), 
    }, 
    module: { 
    loaders: [ 
    { test: /\.js$/, loader: 'babel', exclude: /node_modules/, query: { presets: ['es2015'] } }, 
    { test: /\.css$/, loader: ExtractTextPlugin.extract('style', 'css?sourceMap&importLoaders=1!postcss') }, 
    ], 
    }, 
    vendor: [ 
    'underscore', 
    ], 
    plugins: [ 
    new ExtractTextPlugin('si-styles.css'), 
    new webpack.ProvidePlugin({ 
     underscore: 'underscore', 
    }), 
    ], 
    postcss: function(webpack) { 
    return [ 
     postcssImport({ addDependencyTo: webpack }), // Must be first item in list 
     precss, 
     autoprefixer({ browsers: ['last 2 versions'] }), 
    ]; 
    }, 

}; 
+1

Non puoi chiamare '_', anche se lo hai importato in uno dei tuoi moduli, perché i moduli come l'istruzione' import' di ES6 sono progettati per evitare di inquinare lo spazio globale. Qualcosa dovrebbe assegnare quel modulo allo scope globale o all'oggetto globale ('window') in modo che tu possa avere un riferimento ad esso e usarlo al di fuori di uno dei tuoi moduli in cui lo hai importato. Vedere [i documenti WebPack su come ottenere WebPack per farlo per qualsiasi modulo] (https://webpack.github.io/docs/shimming-modules.html). –

risposta

5

Al fine di raggiungere che è possibile utilizzare questo plugin webpack:

new webpack.ProvidePlugin({ 
    underscore: "underscore" 
}) 

dal modo in cui non è necessario che si importa la libreria nel file indice della directory. Avrete accesso alla biblioteca specificando anche un nuovo punto di ingresso nel file di configurazione webpack .. Si potrebbe poi mettere tutto il codice fornitore in un boundle vendor.js in questo modo:

entry: { 
    main: [ 
     './app/js/main.js' 
    ], 
    vendor: [ 
      'underscore', 
      'lodash', 
      'my-awesome-library!' 
     ] 
    } 

UPDATE: C'è una buon tutorial su come usare il webpack in produzione su egghead.io .. Prova a check it out!

+0

Grazie mille, ha funzionato! Sei in grado di spiegare il motivo per cui sebbene fosse incluso in bundle.js, non era disponibile per essere utilizzato? –

+0

Grazie per l'aggiornamento - temo di averti perso. Ho rimosso il modulo di importazione my index.js come suggerito e ho aggiunto un array per il venditore al mio webpack. Tuttavia non funziona più ... aggiornerò la mia domanda originale con la mia configurazione del webpack –

+0

Mi permetta di controllare che non ti abbia dato un cattivo consiglio nella seconda parte (rimuovi l'importazione) Funziona per me, ma non l'ho non indagare ... Per quanto riguarda la tua prima domanda, penso che abbia a che fare con il modo in cui il webpack usa per rinominare tutti i moduli che vengono importati. Dovresti provare a inserire un breakpoint nel tuo codice e vedere usare la console che è il nome delle variabili ... Spero che questo aiuti .. – piratz