2017-09-12 12 views
1

J'ai essayé d'utiliser le chargeur sass dans webpack et je suis ces instructions ->https://github.com/webpack-contrib/extract-text-webpack-plugin#extracting-sass-or-less mais cela ne fonctionne pas.Webpack 3: Utiliser sass-loader et ExtractTextPlugin ne fonctionne pas

Quelqu'un peut-il m'aider?

référentiel

https://github.com/gpincheiraa/boolean-html-js-exercises/tree/dev

erreur

ERROR in Error: Child compilation failed: 
    Module build failed: Error: "extract-text-webpack-plugin" loader is used without the corresponding plugin, refer to https://github.com/webpack/extract-text-webpack-plugin for the usage example 

    - Error: "extract-text-webpack-plugin" loader is used without the corresponding plugin, refer to https://github.com/webpack/extract-text-webpack-plugin for the usage example 

dépendances

node v6.11.1 
npm 5.3.0 

├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
└── [email protected] 

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin'); 
const ExtractTextPlugin = require('extract-text-webpack-plugin'); 

module.exports = { 
    entry: [ 
     "./index.js" 
    ], 
    output: { 
     path: __dirname + "/dist", 
     filename: "index.bundle.js" 
    }, 
    module: { 
     rules: [ 
      { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }, 
      { test: /\.md$/, loaders: [ "html-loader", "markdown-loader" ] }, 
      { test: /\.scss$/, 
       use: ExtractTextPlugin.extract({ 
        fallback: 'style-loader', 
        use: ['css-loader', 'sass-loader'] 
       }) 
      } 
     ] 
    }, 
    plugins: [ 
     new ExtractTextPlugin('style.css'), 
     new HtmlWebpackPlugin({ 
      template: 'index.html', 
      inject: 'body' 
     }) 
    ], 
    devtool: "eval-source-map", 
    devServer: { 
     filename: "index.bundle.js", 
     contentBase: "./", 
     port: 3000, 
     publicPath: "/", 
     stats: { 
      colors: true 
     } 
    } 
}; 

Répondre

3

La question vient de la commented style code in your index.html. Le index.html est traité par le html-webpack-plugin et, pour une raison quelconque, il essaie toujours de traiter les appels require (line 9 et line 11). La raison pourrait être le chargeur EJS personnalisé de html-webpack-plugin.

La solution la plus simple consiste à supprimer complètement le code commenté de index.html.

En important un fichier .scss, la règle que vous avez configurée est appliquée à celui-ci. Mais il semble que l'instance réelle extract-text-webpack-plugin n'est pas disponible pendant ce processus. Vous utilisez un chargeur en ligne dans ces appels nécessitent, mais vos règles configurées seront toujours appliquées à cela. Pour empêcher l'application d'autres chargeurs, vous pouvez préfixer l'importation avec un !.

De l'webpack documentation - Rule.enforce:

peut être omise Tous les chargeurs normaux (surchargées) par préfixer ! dans la demande.

Tous les chargeurs normaux et pré-chargeurs peuvent être omis (remplacés) en préfixant -! dans la demande.

Tous les chargeurs normaux, postaux et pré-chargeurs peuvent être omis (remplacés) par le préfixe !! dans la demande.

Pour pouvoir utiliser le CSS correctement dans votre code HTML, vous devez également utiliser css-loader après la sass-loader, parce EJS attend JavaScript à cet endroit, pas CSS nue. Le besoin deviendrait:

<%= require("!css-loader!sass-loader!\./sass/index.scss") %> 

Il serait également préférable d'importer index.scss dans votre application réelle au lieu du modèle qui est utilisé par html-webpack-plugin.

+0

vous m'avez sauvé la vie. Était une erreur conceptuelle de moi. J'ai lu ce docs: https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md et enfin je comprends pour complètement. Merci pour votre réponse génial! –

+1

La modification: https://github.com/gpincheiraa/boolean-html-js-exercises/commit/2290ff64079d9e6ced40d2cf1f82d2f612ca8745 –

0

Je suis venu ici parce que ma configuration avec Webpack 3 + Sass + React ne fonctionnait pas non plus.

Cependant, dans mon cas, le problème était très stupide.Je dois dire que j'ai créé le projet avec l'outil create-react-app et il définit un fichier webpack.config.dev.js avec une configuration complexe/complète tranquille.

Le problème était que j'ajoutais la règle sassAPRÈS le exclude un et il dit clairement dans les commentaires (HAD) que chaque chargeur après que l'on ne fonctionnera pas.

Il ressemble maintenant à ceci et cela fonctionne:

 { 
     test: /\.scss$/, 
     use: ExtractTextPlugin.extract({ 
      fallback: 'style-loader', 
      use: [require.resolve('css-loader'), require.resolve('sass-loader')], 
     }) 
     }, 
     { 
     exclude: [/\.js$/, /\.html$/, /\.json$/], 
     loader: require.resolve('file-loader'), 
     options: { 
      name: 'static/media/[name].[hash:8].[ext]', 
     }, 
     }, 

L'espoir que cela aide quelqu'un à l'avenir.