output 属性告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件。


    生产环境的 output 需要通过 contenthash 值来区分版本和变动,可达到清缓存的效果,而本地环境为了构建效率,则不引人 contenthash

    新增 paths.js,封装路径方法:

    1. const fs = require('fs') // 异步操作,fs 读取文件模块
    2. const path = require('path') // 引入路径
    3. const appDirectory = fs.realpathSync(process.cwd());
    4. const resolveApp = relativePath => path.resolve(appDirectory, relativePath);
    5. // 导出项目的路径/文件
    6. module.exports = {
    7. resolveApp,
    8. appPublic: resolveApp('public'),
    9. appHtml: resolveApp('public/index.html'),
    10. appSrc: resolveApp('src'),
    11. appDist: resolveApp('dist'),
    12. appTsConfig: resolveApp('tsconfig.json'),
    13. }

    修改开发环境配置文件 webpack.dev.js:

    // webpack.dev.js
    
    module.exports =  merge(common, {
      // 输出
      output: {
        // bundle 文件名称
        filename: '[name].bundle.js',
    
        // bundle 文件路径
        path: resolveApp('dist'),
    
        // 编译前清除目录
        clean: true
      },
    })
    

    修改生产环境配置文件 webpack.prod.js:

    module.exports =  merge(common, {
      // 输出
      output: {
        // bundle 文件名称 【只有这里和开发环境不一样】
        filename: '[name].[contenthash].bundle.js',
    
        // bundle 文件路径
        path: resolveApp('dist'),
    
        // 编译前清除目录
        clean: true
      },
    })
    

    上述 filename 的占位符解释如下:

    • [name] - chunk name(例如 [name].js -> app.js)。如果 chunk 没有名称,则会使用其 id 作为名称
    • [contenthash] - 输出文件内容的 md4-hash(例如 [contenthash].js -> 4ea6ff1de66c537eb9b2.js)