用于 sass 的 webpack live 热重载

新手上路,请多包涵

我正在为 React Starter 构建工作流程,并希望在更改 scss 文件时自动重新加载浏览器。

目前,当我在我的 index.js 文件(设置为我的入口点)中进行更改时,webpack 将热重新加载。但是,当我在 scss 文件中更改/添加 scss 代码时,它会被编译,但 css 不会在任何地方输出,也不会触发浏览器重新加载。

我是 webpack 的新手,非常感谢这里的一些见解。

这是我的 webpack.config.js

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

module.exports = {
    entry: ['./src/js/index.js', './src/scss/style.scss'],
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'js/index_bundle.js',
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader'
                }
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
            {
                test: /\.scss$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            name: '[name].css',
                            outputPath: 'css/'
                        }
                    },
                    {
                        loader: 'extract-loader'
                    },
                    {
                        loader: 'css-loader'
                    },
                    {
                        loader: 'postcss-loader'
                    },
                    {
                        loader: 'sass-loader'
                    }
                ]
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html'
        })
    ]
}

我的 index.js 入口点文件

import React from 'react';
import ReactDOM from 'react-dom';
import App from '../components/App';

ReactDOM.render(
    <App/>,
    document.getElementById('App')
);

还有我的 App 组件

import React, {Component} from 'react';
import '../../dist/css/style.css';

class App extends Component {
    render() {
        return (
            <div>
                <p>Test</p>
            </div>
        )
    }
}

export default App;

原文由 Vladimir Mujakovic 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 271
1 个回答

实际上, style-loader负责 CSS HMR 的。

您应该将它添加到样式管道的末尾,仅适用于开发人员。对于生产,您可以保留您的配置。

它应该看起来像这样:

 const devMode = process.env.NODE_ENV !== 'production'

{
  test: /\.scss$/,
  use: [
    devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
    {
      loader: 'css-loader'
    },
    {
      loader: 'postcss-loader'
    },
    {
      loader: 'sass-loader'
    }
  ]
}

注意,将 css 提取到单独文件的最佳做法是使用 MiniCssExtractPlugin 如果您使用的是 webpack 4,或者 ExtractTextWebpackPlugin 如果您使用的是 webpack < 4。

原文由 felixmosh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题