BrowserSync重新加载整个页面而不是注入CSS

时间:2017-12-10 21:59:51

标签: webpack sass browser-sync webpack-style-loader

我正在开发一个包含CSS样式表的WordPress插件。我决定从Gulp迁移到Webpack,因为我打算在未来开始使用React.js进行开发,并认为习惯Webpack是一件好事。

因此我成功处理,最小化和解压缩.scss文件。与我的.js文件相同。问题是我尝试使用BrowserSync在.php文件更改时重新加载页面,并在每次Webpack构建新的dist / * .css文件时注入我的css更改,但BrowserSync每次都重新加载整个页面有css改变。奇怪的是,在完成重新加载之前,它会注入更改。我已经尝试过观看.css文件并在更改时执行bs.reload({stream:true}),但它仍然可以完全重新加载。

有谁知道会发生什么?我怀疑是BrowserSync配置问题,因为它在完全重新加载之前有效地注入了更改,但我无法弄清楚导致问题的设置。

这是webpack.config.js:

const path              = require('path');
const UglifyJS          = require('uglifyjs-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const extractSass       = new ExtractTextPlugin({
  filename: "../dist/[name].min.css"
});
const BrowserSyncPlugin = require('browser-sync-webpack-plugin');

module.exports = {
  entry: './src/js/main.js',
  output: {
    filename: 'custom.min.js',
    path: path.resolve(__dirname, 'dist')
  },
  plugins: [
    new UglifyJS({sourceMap: true}),
    extractSass,
    new BrowserSyncPlugin({
      host: 'localhost',
      port: '3000',
      proxy: 'http://domain.localdev',
      open: false,
      files: [{
        match: ['**/*.php'],
        fn: function(event, file) {
          if (event === "change") {
            const bs = require('browser-sync').get('bs-webpack-plugin');
            bs.reload();
          }
        }
      },
      {
        match: ['dist/*.css', 'dist/*.js'],
        fn: function(event, file) {
          if (event === "change") {
            const bs = require('browser-sync').get('bs-webpack-plugin');
            bs.stream();
          }
        }
      }],
      injectChanges: true,
      notify: true
    })
  ],
  externals: {
    jquery: "jQuery"
  },
  devtool: "source-map",
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['babel-preset-env'],
            sourceMap: true
          }
        }
      },
      {
        test: /\.scss$/,
        use: extractSass.extract({
          use: [{
            loader: "css-loader",
            options: {
              minimize: true,
              sourceMap: true
            }
          },
          {
            loader: "sass-loader",
            options: {
              sourceMap: true
            }
          }],
          fallback: "style-loader"
        })
      },
      {
        test: /\.css$/,
        loader: 'style-loader',
      },
      {
        test: /\.css$/,
        loader: 'css-loader',
        options: {
          minimize: true
        }
      }
    ]
  }
}

2 个答案:

答案 0 :(得分:0)

好的,这是......快?我再次检查了browser-sync-webpack-plugin文档,在页面底部我发现你可以将一个选项对象传递给插件设置reload:false。通过这样做,页面在构建过程完成时不会重新加载,但它会注入更改。只需将['**/*.php']匹配留在"文件"初始化BrowserSyncPlugin对象时,该页面将在php更改时重新加载。

所以我按照自己的意愿开始工作。对我而言!

答案 1 :(得分:0)

我遇到了同样的问题,我发现您应该检测到函数中哪个文件已更改,并且 bs-webpack-plugin 并未将JavaScript注入仅浏览器的CSS样式表中,如代码所示在下面。

new BrowserSyncPlugin({
   host: HOST,
   open: false,
   files: [
     {
       match: ['dist/*.css', 'dist/*.js', '**/*.php'],
       fn: (event, file) => {
         if (event == 'change') {
           const bs = require("browser-sync").get("bs-webpack-plugin");
           if (file.split('.').pop()=='js' || file.split('.').pop()=='php' ) {
             bs.reload();
           } else {
             bs.reload("*.css");
           }
         }
       }
     }
   ]
 },
 {
   reload: false,
   name: 'bs-webpack-plugin'
 }
)