【问题标题】:WebPack how to put all css files into one css fileWebPack如何将所有css文件放入一个css文件中
【发布时间】:2017-03-14 08:47:07
【问题描述】:

我是 WebPack 的新手,我希望能够获取一个 CSS 文件目录 (.app/styles/[css files...]) 并将它们输出到一个 CSS 文件 (dist/styles.css )。

目前,所有的 JavaScript 文件都被编译成一个单独的“index_bundle.js”文件,这很完美,但我想为我的 CSS 文件实现同样的效果。

经过大量“谷歌搜索”后,我发现 WebPack 的 ExtractTextPlugin 应该能够帮助解决这个问题,但这仅适用于添加到“条目”属性的一个 CSS 文件(例如:条目:{style : "./app/styles/style.css"}) 然后将其作为链接标签添加到 html 的头部,这很好,但我希望我的所有 css 文件进入一个 styles.css 文件,然后使用它在 html 的头部作为链接。

我当前的 WebPack 配置如下所示:

var HtmlWebpackPlugin = require('html-webpack-plugin');
var HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
    template: __dirname + '/app/index.html',
    filename: 'index.html',
    inject: 'body'
});

var ExtractTextPlugin = require('extract-text-webpack-plugin');
var ExtractTextPluginConfig = new ExtractTextPlugin(
    "styles.css", 
    {
        allChunks: false
    }
);

module.exports = {
    entry: {
        index: "./app/index.js"//,
        //styles: "./app/styles/style1.css" // I don't want one file, I want to use a directory eg: "./app/styles/"
    },
    output: {
        path: __dirname + '/dist',
        filename: 'index_bundle.js'
    },
    module: {
        loaders: [
            {
                test: /\.js$/, 
                exclude: /node_modules/, 
                loader: 'babel-loader'
            },
            { 
                test: /\.css$/, 
                loader: ExtractTextPlugin.extract("style-loader", "css-loader")
            }
        ]
    },
    plugins: [
        HtmlWebpackPluginConfig,
        ExtractTextPluginConfig
    ]
}

有人可以指出我正确的方向吗?即使它是另一个插件或不同的方法。任何帮助将不胜感激!

编辑: 我的新 WebPack 配置如下所示:

var HtmlWebpackPlugin = require('html-webpack-plugin');
var HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
    template: __dirname + '/app/index.html',
    filename: 'index.html',
    inject: 'body'
});

var ExtractTextPlugin = require('extract-text-webpack-plugin');
var ExtractTextPluginConfig = new ExtractTextPlugin(
    "index_bundle.css"
);

module.exports = {
    entry: [
        './app/index.js',
        './app/index.css'
    ],
    output: {
        path: __dirname + '/dist',
        filename: 'index_bundle.js'
    },
    module: {
        preloaders: [
            {
                test: /\.css/,
                exclude: /styles/, 
                loader: 'import-glob-loader'
            }
        ],
        loaders: [
            {
                test: /\.js$/, 
                exclude: /node_modules/, 
                loader: 'babel-loader'
            },
            { 
                test: /styles\.css$/, 
                loader: ExtractTextPlugin.extract("style-loader", "css-loader")
            },
            { 
                test: /\.json$/, 
                loader: 'json' 
            }
        ]
    },
    devServer: {
        historyApiFallback: true
    },
    plugins: [
        HtmlWebpackPluginConfig,
        ExtractTextPluginConfig
    ]
}

【问题讨论】:

  • webpack 的工作方式是遍历主入口文件的依赖树(导入)。因此,通常,要将所有 css 捆绑在一个目录中,您需要为所有其他 css 文件创建索引 styles.css@import(按照您希望它们出现在捆绑包中的顺序。
  • 那么这是否意味着我每次添加新的 css 文件时都必须记住将所有 @imports 放入?
  • 不,你需要一个全局导入:@import './mydir/**/*.css'
  • 我正在使用“import-glob-loader”,但现在 WebPack 在运行 webpack 开发服务器时失败:“意外字符 '@'”。当我取出 css 条目时它可以工作,所以即使使用 glob 预加载器,它的语法似乎也会失败......

标签: javascript css webpack html-webpack-plugin


【解决方案1】:

好的,所以这似乎是一个驼峰问题。

Davin Tryon 的帮助下,我能够解决我的问题 - 谢谢!

如果你看:https://www.npmjs.com/package/import-glob-loader 他们有以下几点:

preloaders: [{
    test: /\.scss/,
    loader: 'import-glob-loader'
}]

应该是:

preLoaders: [{
    test: /\.scss/,
    loader: 'import-glob-loader'
}]

所以最后,我的整个 webpack.config.json 看起来像这样:

var HtmlWebpackPlugin = require('html-webpack-plugin');
var HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
    template: __dirname + '/app/index.html',
    filename: 'index.html',
    inject: 'body'
});

var ExtractTextPlugin = require('extract-text-webpack-plugin');
var ExtractTextPluginConfig = new ExtractTextPlugin(
    "index_bundle.css"
);

module.exports = {
    entry: [
        './app/index.js',
        './app/index.css'
    ],
    output: {
        path: __dirname + '/dist',
        filename: 'index_bundle.js'
    },
    module: {
        preLoaders: [
            {
                test: /\.css$/,
                exclude: /styles/, 
                loader: 'import-glob-loader'
            }
        ],
        loaders: [
            {
                test: /\.js$/, 
                exclude: /node_modules/, 
                loader: 'babel-loader'
            },
            { 
                test: /\.css$/, 
                loader: ExtractTextPlugin.extract("style-loader", "css-loader")
            },
            { 
                test: /\.json$/, 
                loader: 'json' 
            }
        ]
    },
    devServer: {
        historyApiFallback: true
    },
    plugins: [
        HtmlWebpackPluginConfig,
        ExtractTextPluginConfig
    ]
}

我的 index.css 文件如下所示:

@import './styles/**/*';

这对我有用,我得到一个 css 输出文件“index_bundle.css”。样式和脚本也会自动注入到 html 模板中。

注入前的index.html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Admin - Login</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css"/>
    </head>
    <body>
        <div id="app"></div>
    </body>
</html>

/dist 文件夹中注入后的index.html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Admin - Login</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css"/>
    <link href="index_bundle.css" rel="stylesheet"></head>
    <body>
        <div id="app"></div>
    <script type="text/javascript" src="index_bundle.js"></script></body>
</html>

【讨论】:

  • omg,这是第一个关于在 webpack 中提取 css 的方法,最终成功了!谢谢!
  • 很高兴它帮助了你,兄弟!
  • 注意:module.preLoaders 一直是removed in Webpack 2
猜你喜欢
  • 2016-03-24
  • 2012-05-18
  • 2017-11-12
  • 1970-01-01
  • 2021-02-16
  • 2018-05-17
  • 2020-11-13
  • 2015-01-11
  • 2020-07-17
相关资源
最近更新 更多