【问题标题】:Webpack 3 - Writing styles to a CSS fileWebpack 3 - 将样式写入 CSS 文件
【发布时间】:2018-05-25 08:39:53
【问题描述】:

我阅读了大量的教程并查看了比我想记住的更多的 Github 存储库,但我真的很难设置 Webpack 3 来执行以下操作:

  • 将 SASS 编译成 CSS
  • 在 dist 目录中创建 CSS 文件
  • 在 CSS 上运行 Autoprefixer

下面是我的 webpack.config.js:

const path = require('path')
const webpack = require('webpack')
const ExtractTextPlugin = require('extract-text-webpack-plugin')

module.exports = {
    context: path.resolve(__dirname, 'src'),
        entry: {
        app: './js/index.js',
    },
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist'),
        publicPath: '/dist',                          // New
    },
    devServer: {
        contentBase: path.resolve(__dirname, 'src'),    // New
    },

    module: {
        rules: [
            {
                test: /\.js$/i,
                exclude: [/node_modules/],
                use: [{
                    loader: 'babel-loader',
                    options: { presets: ['env'] },
                }],
            },
            {
              test: /\.css$/,
              use: ExtractTextPlugin.extract({
                fallback: "style-loader",
                use: "css-loader"
              })
            },
            {
              test: /\.(sass|scss)$/i,
              use: [
                'style-loader',
                'css-loader',
                'sass-loader',
              ]
            }
        ]
    },
    plugins: [
      new ExtractTextPlugin({
        filename: 'css/styles.css',
        allChunks: true,
      }),
    ]
};

目前:

  • webpack 开发服务器正在运行。
  • 样式从 src/scss/styles.scss 复制到由 src/index.html 提供的 HTML 文件中的内联样式块。

我想创建一个 dist 目录,其中包含一个 styles.css 文件,然后我可以从我的 HTML 中链接到该文件。

谢谢

【问题讨论】:

    标签: webpack webpack-style-loader extract-text-plugin extracttextwebpackplugin


    【解决方案1】:

    将 SASS 编译成 CSS

    您当前正在正确地将 SASS 编译为 CSS

    {
      test: /\.(sass|scss)$/i,
      use: [
        'style-loader',
        'css-loader',
        'sass-loader'
      ]
    }
    

    在 dist 目录中创建 CSS 文件

    由于前面描述的加载程序链中的style-loader,CSS 没有被提取到外部文件中。 style-loader<style> 中内化所有传递给它的 CSS。

    要创建一个您可以使用的外部文件,您就是extract-text-webpack-plugin。唯一的问题是它没有附加到/\.(sass|scss)$/ 测试。

    您只需为源文件创建规则。由于您正在编写 SASS/SCSS,因此不需要 /\.css$/ 测试。如果您将加载器链更改为

    ,则应该提取您的 CSS
    {
      test: /\.(sass|scss)$/i,
      use: ExtractTextPlugin.extract({
        fallback: 'style-loader',
        use: [
          'css-loader',
          'sass-loader'
        ]
      })
    }
    

    在 CSS 上运行 Autoprefixer

    现在,要为 CSS 自动添加前缀,您需要在链中添加另一个加载器 postcss-loader。与autoprefixer一起安装。

    npm i -D postcss-loader autoprefixer
    

    webpack.config.js 的顶部添加对autoprefixer 的要求。

    const autoprefixer = require('autoprefixer');
    

    最后,将postcss-loader 添加到加载器链中,in between css-loader and sass-loader

    use: [
      'css-loader',
      {
        loader: 'postcss-loader',
        options: {
          plugins: [autoprefixer()]
        }
      },
      'sass-loader'
    ]
    

    【讨论】:

    • 一个很好的答案,因为您已经解释了我哪里出错了以及为什么。不幸的是,仍然没有生成 CSS 文件。我已将修改后的 webpack.config.js 粘贴到 Codepen 中。如果有人能快速浏览一下,将不胜感激:codepen.io/decodedcreative/pen/XVWNZe
    • 你有这个项目的 repo 吗?
    • 我刚刚设置了一个:github.com/decodedcreative/react-webpack-boilerplate。谢谢你看这个,它让我发疯了!
    • 啊。您的start 脚本正在运行webpack-dev-server,它不会将任何文件写入磁盘,因为它为内存中的所有文件提供服务。使用webpack 生成捆绑文件,使用webpack-dev-server 生成实时重载开发环境。
    猜你喜欢
    • 2018-07-04
    • 2017-12-09
    • 2019-04-05
    • 2020-06-24
    • 2020-02-23
    • 1970-01-01
    • 2017-11-12
    • 2016-09-25
    • 2018-02-14
    相关资源
    最近更新 更多