当 watch 设置为 true 时,Webpack 运行不干净

Posted

技术标签:

【中文标题】当 watch 设置为 true 时,Webpack 运行不干净【英文标题】:Webpack doesn't run clean when watch is set to true 【发布时间】:2018-07-18 15:28:00 【问题描述】:

这是我的 webpack.config.js 文件:

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

const config = 
    entry: 
        bundle: './javascript/index.js'
    ,
    output: 
        path: path.resolve(__dirname, 'build'),
        filename: '[name].[chunkhash].js'
    ,
    module: 
        rules: [
            
                use: 'babel-loader',
                test: /\.js$/,
                exclude: /node_modules/
            ,
            
                test: /\.css$/,
                use: ExtractTextPlugin.extract(
                    fallback: "style-loader",
                    use: "css-loader"
                )
            ,
            
                test: /\.(jpe?g|png|gif|svg)$/,
                use: [
                    
                        loader: 'url-loader',
                        options: 
                            limit: 40000
                        
                    ,
                    'image-webpack-loader'
                ]
            
        ]
    ,
    plugins: [
        new ExtractTextPlugin('style.css'),
        new HtmlWebpackPlugin(
            template: 'src/index.html'
        )
    ],
    watch: true
;

module.exports = config;

从最后一行可以看出,我将 watch 选项设置为 true。此外,当我对我的任何 javascript 文件进行更改时,我正在使用 chunkhash 生成一个新的 javascript 文件。但是,当 watch 选项设置为“true”时,它不会运行我的 rinraf clean 命令。

这是我的 package.json 文件的一部分:


    "name": "budgety",
    "version": "1.0.0",
    "description": "Budget app",
    "main": "app.js",
    "scripts": 
      "clean": "rimraf build",
      "build": "npm run clean && webpack"
    ,
.
.
.

为什么会这样?

我的目标是:

    在我更新我的任何 javascript 文件后更新我编译的 javascript,因此我不需要每次对我的 js 文件进行更改时都运行“npm run build”。

    清理以前由 'rimraf' 处理的旧 javascript 'hashed' 文件,但由于某种原因,它没有在 watch 模式下清理新的 hashed javascript 文件。

【问题讨论】:

【参考方案1】:

监视模式的工作方式是只重新编译已更改的文件。这就是为什么通常在监视模式期间不启用哈希前缀的原因(因为文件几乎每分钟都在更改,这使得跟踪更改的哈希等变得更加复杂)。换句话说,应该有一个devprod 环境,它们的行为会略有不同。

例如您需要传递一个参数,请参阅here 如何然后在您的配置文件中使用它们:

 filename: env.withHashPrefixes ? '[name].[chunkhash].js' : '[name].js'

现在您无需清理任何内容,因为文件名始终相同

原答案

它会运行并且它不会运行你的 rimraf 命令,因为手表发生在 webpack 内部,它不知道你在它之外运行了什么。

使用clean-webpack-plugin,就这么简单

plugins: [
  new CleanWebpackPlugin('build')
]

【讨论】:

所以这有点工作。我使用 watch 选项并将其设置为 true,但它正在删除此文件夹中的所有图像。 这不应该是因为...? 对不起,我不明白你的评论。此外,如果我不添加 watch 选项,它不会删除旧的散列 javascript 文件。手表效果很好。它会删除旧文件,但不知道为什么要删除已编译的图像。 啊,更新了答案。清洁不是这里最好的方法【参考方案2】:

我遇到了同样的问题,在启用output.clean 时,我在/assets/ 文件夹中的资产被清理并且没有重建。

我已经通过在 webpack.config.js 的清理中忽略 /assets/ 来解决此问题。但是,这不是完美的解决方案,因为过时的资产会保留在文件夹中。

output: 
  clean: 
    keep: /assets\//,
  ,
,

【讨论】:

以上是关于当 watch 设置为 true 时,Webpack 运行不干净的主要内容,如果未能解决你的问题,请参考以下文章

vue watch中deep和immediate的用法

Vue基础-侦听器

watch事件监听方法

vue-watch 基本使用以及高价使用以及回调函数的详细

为啥 Angular 8 CircleCI 构建在执行 ng test --watch-false 时失败,业力配置为 singleRun=true?

当 reloadOnSearch 为 false 时,$location.search 上的 AngularJs $watch 不起作用