0

我有一个 javascript 文件,它不属于我的项目,但在提供时需要与它捆绑在一起。该文件的内容基本上是...

FT.manifest({
   "foo": "bar",
   "id": 3
})

...对象部分是格式良好的 JSON。

我已经设置了 webpack,并且正在使用copy-webpack-plugin将这个文件./dist连同我捆绑的所有 JS 和其他资产一起移动到我的文件夹中。
没有什么花哨的,只是一个文件到文件的直接复制......

new CopyWebpackPlugin({
   patterns: [
      {from:`./src/templates/${dirName}/manifest.js`, to: `${dirName}/manifest.js`},
   ]
})

当我在开发模式下运行 webpack 并且复制的文件看起来与原始文件完全相同时,这可以正常工作,但是当我在生产模式下运行时,内容会被内联并丢失对象部分中键周围的语音标记。输出现在看起来像这样......

FT.manifest({foo:"bar",id:3})

foo注意和上没有语音标记id--mode=production当删除换行符和其他格式(这很好)时,显然会发生一些优化,但它也会剥离语音标记,这会导致某些步骤出现问题。

那么,您能告诉我为什么会发生这种情况,我可以做些什么来阻止这个特定文件在复制过程中被优化。
我无法对特定文件的格式做任何事情,因为它来自第三方,但我可以使用其他插件或在需要时更改我的流程。

谢谢你的帮助

4

1 回答 1

0

我认为如何从“生产”优化过程中排除某些文件的问题是一个有效的问题,但我已经意识到我的具体问题更多地与我笨拙的解决方案有关。我找到了一种更快、更优雅的方法。

我所做的是用来copy-webpack-plugin将文件从我的移动./src到我的./dist然后在它们发出读取它们并在适当的位置操作它们,这添加了一整套文件系统操作以及要求将 js 文件作为字符串读取以及要提取并转换为 JSON 的 Object 部分(在优化文件并去除语音标记后失败)。

我了解到的是,它copy-webpack-plugin本身允许您在复制文件数据时对其执行转换。这意味着您可以获得原始数据,并且可以取消重新读取和转换最终发出的文件的整个过程。

{
   from:`./src/${dirName}/myFile.js`,
   to: `${dirName}/myFile.js`,
   transform:{
      transformer(content, absolutePath){
         let str = content.toString();
         // Make changes to str here and return the amended data
         return str;
      }
   }
}

这就是插件文档中的全部内容,所以对大多数人来说可能并不新鲜,但我不知道你能做到这一点。也许其他人会发现它很有用。

于 2021-02-25T11:54:16.053 回答