Puis-je utiliser webpack pour générer CSS et JS séparément?

j'ai:

  1. fichiers JS que je veux regrouper.
  2. moins de fichiers que je veux compiler vers le bas vers CSS (résoudre @imports en un seul paquet).

j'espérais les spécifier comme deux entrées séparées et avoir deux sorties séparées (probablement via extract-text-webpack-plugin). Webpack a tous les plugins/chargeurs appropriés pour faire la compilation, mais il ne semble pas aimer la séparation.

j'ai vu des exemples de personnes qui ont besoin de leur Moins de fichiers directement à partir de JS, comme require('./app.less');, pour aucune autre raison que de dire webpack à inclure ces fichiers dans le bundle. Cela vous permet de n'avoir qu'un seul point d'entrée, mais cela me semble vraiment erroné -- pourquoi en aurais-je besoin de moins dans mon JS alors que cela n'a rien à voir avec mon code JS?

j'ai essayé d'utiliser plusieurs points d'entrée, en donnant à la fois l'entrée JS et le fichier main LESS, mais en utilisant plusieurs points d'entrée, webpack génère un paquet qui n'exécute pas les JS en charge -- il regroupe tout, mais ne sait pas ce qui doit être exécuté au démarrage.

Est - ce que j'utilise webpack à tort? Dois-je lancer des instances distinctes de webpack pour ces modules distincts? Est-ce que je devrais même utiliser webpack pour des actifs non-JS si Je ne vais pas les mélanger dans mon JS?

34
demandé sur Brent Traut 2016-02-10 21:19:12

4 réponses

Est-ce que je devrais même utiliser webpack pour des actifs non-JS si Je ne vais pas les mélanger dans mon JS?

Peut-être pas. Webpack est définitivement centré sur js, avec l'hypothèse implicite que ce que vous construisez est une application js. Sa mise en œuvre de require() vous permet de tout traiter comme un module (y compris les partiels Sass/LESS, JSON, à peu près n'importe quoi), et fait automatiquement votre gestion de dépendances pour vous (tout ce que vous require est fourni, et rien d'autre).

pourquoi j'aurais besoin de moins dans mon JS quand ça n'a rien à voir avec mon code JS?

les gens font cela parce qu'ils définissent une partie de leur application (par exemple un composant React, une vue de L'épine dorsale) avec js. Ce morceau de la demande a CSS qui va avec elle. Selon une ressource CSS externe qui est construit séparément et pas directement référencé à partir du module js est fragile, plus difficile à travailler, et peut conduire à styles obtenir de la date, etc. Webpack vous encourage à garder tout modulaire, de sorte que vous avez un CSS (Sass, peu importe) partiel qui va avec ce composant js, et le composant js require() s it pour rendre la dépendance claire (à vous et à l'outil de construction, qui ne construit jamais de styles dont vous n'avez pas besoin).

Je ne sais pas si vous pouvez utiliser webpack pour regrouper les CSS par lui-même (lorsque les fichiers CSS ne sont pas référencés à partir d'un js). Je suis sûr que vous pourriez connecter quelque chose avec des plugins, etc. mais pas sûr que c'est possible hors de la boîte. Si vous faites référence aux fichiers CSS de votre js, vous pouvez facilement regrouper les CSS dans un fichier séparé avec le plugin D'extraction de texte, comme vous le dites.

12
répondu Brendan Gannon 2016-02-11 18:51:22

un paquet CSS séparé peut être généré sans utiliser require('main/less) dans n'importe lequel de vos JS, mais comme Brendan l'a souligné dans la première partie de sa réponse Webpack N'est pas conçu pour un paquet CSS global pour aller à côté des js modulaires, cependant il y a quelques options.

la première est d'ajouter un point d'entrée supplémentaire pour main.moins, puis utilisez le plugin de texte D'extrait pour créer le paquet CSS:

var webpack = require('webpack'),
    ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: {
        home: [
            'js/common',
            'js/homepage'
        ],
        style: [
            'styles/main.less'
        ]
    },
    output: {
        path: 'dist',
        filename: "[name].min.js"
    },
    resolve: {
        extensions: ["", ".js"]
    },
    module: {
        loaders: [{
            test: /\.less$/,
            loader: ExtractTextPlugin.extract("style", "css", "less")
        }]
    },
    plugins: [
        new ExtractTextPlugin("[name].min.css", {
            allChunks: true
        })
    ]
};

le problème avec cette méthode est que vous générez aussi un fichier JS indésirable comme ainsi que le paquet, dans cet exemple:style.js qui est juste un module webpack vide.

une autre option consiste à ajouter le fichier principal moins à un point d'entrée Webpack existant:

var webpack = require('webpack'),
    ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: {
        home: [
            'js/common',
            'js/homepage',
            'styles/main.less'
        ],
    },
    output: {
        path: 'dist',
        filename: "[name].min.js"
    },
    resolve: {
        extensions: ["", ".js"]
    },
    module: {
        loaders: [{
            test: /\.less$/,
            loader: ExtractTextPlugin.extract("style", "css", "less")
        }]
    },
    plugins: [
        new ExtractTextPlugin("[name].min.css", {
            allChunks: true
        })
    ]
};

c'est idéal si vous n'avez qu'un seul point d'entrée, mais si vous en avez plus, alors votre configuration Webpack aura l'air un peu bizarre car vous devrez choisir arbitrairement le point d'entrée pour ajouter le fichier Moins principal.

10
répondu bdmason 2016-07-07 15:06:50

pour clarifier davantage la réponse précédente de bdmason - il semble que la configuration souhaitable serait de créer un paquet JS et CSS pour chaque page, comme ceci:

 entry: {
        Home: ["./path/to/home.js", "./path/to/home.less"],
        About: ["./path/to/about.js", "./path/to/about.less"]
    }

Et [name] switch:

output: {
        path: "path/to/generated/bundles",
        filename: "[name].js"
    },
plugins: new ExtractTextPlugin("[name].css")

configuration Complète - avec quelques ajouts non connecté à la question (nous sommes en fait l'utilisation de SASS au lieu de MOINS):

var ExtractTextPlugin = require("extract-text-webpack-plugin");
var debug = process.env.NODE_ENV !== "production";
var webpack = require('webpack');
require('babel-polyfill');

module.exports = [{
    devtool: debug ? "inline-sourcemap" : null,
    entry: {
        Home: ['babel-polyfill', "./home.js","path/to/HomeRootStyle.scss"],
        SearchResults: ['babel-polyfill', "./searchResults.js","path/to/SearchResultsRootStyle.scss"]
    },
    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                exclude: /(node_modules|bower_components)/,
                loader: 'babel-loader',
                query: {
                    presets: ['react', 'es2015'],
                    plugins: ['react-html-attrs', 'transform-class-properties', 'transform-decorators-legacy']
                }
            },
            {
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract("style-loader","css-raw-loader!sass-loader")
            }
        ]
    },
    output: {
        path: "./res/generated",
        filename: "[name].js"
    },
    plugins: debug ? [new ExtractTextPlugin("[name].css")] : [
        new ExtractTextPlugin("[name].css"),
        new webpack.DefinePlugin({
            'process.env':{
                'NODE_ENV': JSON.stringify('production')
            }
        }),
        new webpack.optimize.UglifyJsPlugin({
            compress:{
                warnings: true
            }
        })
    ]
}
];
3
répondu Gilad Barner 2016-07-24 12:17:06

dans le corps.js

// CSS
require('css/_variable.scss')
require('css/_npm.scss')
require('css/_library.scss')
require('css/_lib.scss')

puis dans webpack

  entry: {
    body: [
      Path.join(__dirname, '/source/assets/javascripts/_body.js')
    ]
  },

const extractSass = new ExtractTextPlugin({
  filename: 'assets/stylesheets/all.bundle.css',
  disable: process.env.NODE_ENV === 'development',
  allChunks: true
})
0
répondu Ian Warner 2017-06-16 11:23:30