You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Webpack 5结合@WordPress/Scripts构建时webpack-remove-empty-scripts插件误删asset.php文件的解决求助

Fix: webpack-remove-empty-scripts Deleting asset.php Files with WordPress Scripts

我之前在基于@wordpress/scripts的项目里也遇到过完全相同的问题!罪魁祸首是webpack-remove-empty-scripts的默认执行时机和匹配逻辑——它会在DependencyExtractionWebpackPlugin生成asset.php之前就运行,而且会把和CSS入口关联的所有产物(包括自动生成的asset.php)都判定为空脚本的附属文件一起删掉,单纯用ignore匹配文件名根本拦不住。

这里有两个经过验证的解决方案,你可以按顺序尝试:

方案1:调整插件执行阶段+精准匹配文件类型

这是最推荐的方法,通过修改插件的运行时机,让它在asset.php生成完成后再处理空JS文件,同时精准限定只检查JS文件:

const otherStyleConfig = {
  ...defaultConfig,
  entry: {
    'blog': path.resolve( './src/sass', 'blog.scss' ),
    'editor': path.resolve( './src/sass', 'editor.scss' ),
    'header-footer': path.resolve( './src/sass', 'header-footer.scss' ),
    'partners': path.resolve( './src/sass', 'partners.scss' ),
    'posts-and-pages': path.resolve( './src/sass', 'posts-and-pages.scss' ),
    'resource-center': path.resolve( './src/sass', 'resource-center.scss' ),
    'resource-single': path.resolve( './src/sass', 'resource-single.scss' ),
    'support-center': path.resolve( './src/sass', 'support-center.scss' ),
    'table-of-contents': path.resolve( './src/sass', 'table-of-contents.scss' ),
    'widgets': path.resolve( './src/sass', 'widgets.scss' ),
  },
  module: {
    // 你的module配置不变
    rules: [/* ... */],
  },
  output: {
    path: path.resolve(__dirname, 'build/css'),
  },
  devtool: 'source-map',
  plugins: [
    new MiniCssExtractPlugin(),
    new DependencyExtractionWebpackPlugin(),
    new RemoveEmptyScriptsPlugin({
      verbose: true,
      // 关键:让插件在所有产物处理插件之后再运行
      stage: RemoveEmptyScriptsPlugin.STAGE_AFTER_PROCESS_PLUGINS,
      // 仅匹配JS文件,避免触碰PHP产物
      test: /\.js$/,
      // 双重保险:明确忽略asset.php文件
      ignore: [/.*asset.php$/],
    }),
  ]
}

关键配置解释:

  • stage: RemoveEmptyScriptsPlugin.STAGE_AFTER_PROCESS_PLUGINS:这个选项会延迟插件的执行时机,确保DependencyExtractionWebpackPlugin已经生成了asset.php,此时插件不会把PHP文件和空JS关联起来删除。
  • test: /\.js$/:精准限定插件只处理JS文件,从根源避免它去检查PHP产物。
  • ignore: [/.*asset.php$/]:作为额外的安全层,确保即使有意外情况,asset.php也不会被删除。

方案2:用自定义逻辑判断是否删除文件

如果方案1还是没解决问题,可以试试用enabled选项结合函数来手动控制哪些文件需要删除:

new RemoveEmptyScriptsPlugin({
  verbose: true,
  enabled: (filename) => {
    // 只删除后缀为.js的空文件,同时排除任何和asset.php相关的文件
    return filename.endsWith('.js') && !filename.includes('asset.php');
  }
})

这个方法更灵活,直接通过函数判断每个文件是否需要被删除,完全避免误删PHP产物的可能。

内容的提问来源于stack exchange,提问作者Tyler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:52:30