webpack打包的dist文件内复制文件

一、src内的文件向dist文件复制文件

  • 首先,安装copy-webpack-plugin插件:
npm install copy-webpack-plugin --save-dev
  • 接下来,在Vue项目的根目录下,创建或编辑vue.config.js文件,并添加以下配置:
// vue.config.js
const CopyPlugin = require('copy-webpack-plugin');
const path = require('path');

module.exports = {
  configureWebpack: {
     resolve: {
      	alias: {
          '@': path.resolve(__dirname, 'src'),
        }
     },
    plugins: [
      new CopyPlugin({
        patterns: [
           {
            from: 'src/App.vue',
            to: 'dist',
          },
        ],
      }),
    ],
  },
};
  • 成功!打包后生成的效果
    在这里插入图片描述

二、dist目录下有去除js,img,css等文件夹 把里面的内容直接和index.html文件夹平级

  • 最近碰到有这个需求,如果使用copy-webpack-plugin插件上面这种方式会出现下面报错,打包的过程中没找到需要被复制的文件夹中的文件。
 plugins: [
      new CopyWebpackPlugin({
        patterns: [
           {
             from: path.resolve(__dirname, 'dist', 'js'),
             to: path.resolve(__dirname, 'dist')
           },
           {
             from: path.resolve(__dirname, 'dist', 'img'),
             to: path.resolve(__dirname, 'dist')
           },
        ]
      }),
      ]

在这里插入图片描述

使用fs-extra

webpack打包完成后,再去复制 dist 目录下的文件,可以使用 Node.jsfs 模块来实现这一目的。在构建完成后的钩子中编写代码来复制文件,例如 afterEmit 钩子或者在构建完成后的回调函数中进行操作。

  • 首先,安装 fs-extra 依赖:
npm install fs-extra --save-dev
  • 然后,在你的 webpack配置文件中,可以应用这个方法:
const fs = require('fs-extra');
const path = require('path');
module.exports = {
  plugins: [
	{
        apply: (compiler) => {
          compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => {
            const sourcePaths = [
              path.resolve(__dirname, 'dist', 'js'),
              path.resolve(__dirname, 'dist', 'css'),
              // path.resolve(__dirname, 'dist', 'img'),
              path.resolve(__dirname, 'dist', 'fonts')
            ];

            const targetPath = path.resolve(__dirname, 'dist');
            sourcePaths.forEach((sourcePath) => {
              try {
                fs.copySync(sourcePath, targetPath);
                console.log(`${sourcePath} copied successfully!`);

                 // 删除源文件夹
                fs.removeSync(sourcePath);
                console.log(`Source folder ${sourcePath} removed successfully!`);
              } catch (err) {
                console.error(`Error copying ${sourcePath}:`, err);
              }
            });


          });
        }
      }
  ]
};

以上需要确保将路径和目录名称调整为你实际的目录结构。这个方法将在 webpack构建完成后执行文件复制操作。

  • 成功!
    在这里插入图片描述

可能会出现的错误

  • 1、提示入口点大小限制:以下入口点组合资产大小超过建议限制(244kib)。这可能会影响web性能?
  • 可以设置限制入口点文件大小来去除警告
    在这里插入图片描述
	configureWebpack: {
	     performance: {
	       hints: false,
	       maxEntrypointSize: 512000, // 限制入口点文件大小
	       maxAssetSize: 512000, // 限制单个文件大小
	     },
     }
  • 2 、如果提示找不到某个文件,但是这个文件又能在dist目录下找到?
  • 可能是因为没有完全复制完 就删除了源文件导致的错误
    在这里插入图片描述
  • 复制完成之后再去删除源文件,可修改成一下代码
plugins: [
      {
        apply: (compiler) => {
          compiler.hooks.afterEmit.tap('AfterEmitPlugin', async (compilation) => {
            const sourcePaths = [
              path.resolve(__dirname, 'dist', 'js'),
              path.resolve(__dirname, 'dist', 'css'),
              // path.resolve(__dirname, 'dist', 'img'),
              path.resolve(__dirname, 'dist', 'fonts')
            ];
            const targetPath = path.resolve(__dirname, 'dist');
            for (const sourcePath of sourcePaths) {
              try {
                await fs.copy(sourcePath, targetPath);
                console.log(`${sourcePath} copied successfully!`);
        
                await fs.remove(sourcePath);
                console.log(`Source folder ${sourcePath} removed successfully!`);
              } catch (err) {
                console.error(`Error copying ${sourcePath}:`, err);
              }
            }
          });
        }
      }
    ],

完整代码如下:

const { defineConfig } = require('@vue/cli-service')
const path = require('path');
const fs = require('fs-extra');

module.exports = defineConfig({
  transpileDependencies: true,
  outputDir: "dist",
  configureWebpack: {
    performance: {
      hints: false,
      maxEntrypointSize: 512000, // 限制入口点文件大小
      maxAssetSize: 512000, // 限制单个文件大小
    },
    resolve: {
      alias: {
        '@': path.resolve(__dirname, 'src'),
      },
    },
    plugins: [
      {
        apply: (compiler) => {
          compiler.hooks.afterEmit.tap('AfterEmitPlugin', async (compilation) => {
            const sourcePaths = [
              path.resolve(__dirname, 'dist', 'js'),
              path.resolve(__dirname, 'dist', 'css'),
              // path.resolve(__dirname, 'dist', 'img'),
              path.resolve(__dirname, 'dist', 'fonts')
            ];
            const targetPath = path.resolve(__dirname, 'dist');
            for (const sourcePath of sourcePaths) {
              try {
                await fs.copy(sourcePath, targetPath);
                console.log(`${sourcePath} copied successfully!`);
        
                await fs.remove(sourcePath);
                console.log(`Source folder ${sourcePath} removed successfully!`);
              } catch (err) {
                console.error(`Error copying ${sourcePath}:`, err);
              }
            }
          });
        }
      }
    ],
  },
})

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目经过webpack打包后会生成一个dist文件夹,其中包含了经过处理和压缩后的最终产物。dist文件夹下的内容是部署到服务器或发布到线上环境的静态资源文件dist文件夹的结构取决于webpack的配置以及项目的需求。通常它会包含一个或多个JS文件,包括应用的逻辑代码和依赖的第三方库,以及一个或多个CSS文件,包含项目的样式代码。此外,还会包含一些字体文件、图片或其他静态资源,这些文件在构建过程中被处理并复制dist文件夹中。 在项目开发过程中,dist文件夹不会被直接修改,而是由webpack根据配置和源代码生成。webpack处理过程中会进行代码的压缩、合并、混淆等操作,以减小文件大小并提高加载速度。此外,webpack还会处理一些前端框架或工具的特定需求,例如处理jsx代码、提取公共模块等。 通过打包后的dist文件,我们可以快速查看打包后的效果,验证代码是否正确地被处理和运行。同时,dist文件也是发布项目到线上环境的基础,我们可以将dist文件夹中的内容直接上传到服务器进行部署,并通过浏览器访问项目的最终版本。 总的来说,dist文件夹是经过webpack处理后的项目产物,包含了所有打包后的静态资源文件。它具有优化过的代码和资源,适合部署和发布到线上环境使用,能够提供更好的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值