阿里云主机折上折
  • 微信号
Current Site:Index > Detailed explanation of output configuration

Detailed explanation of output configuration

Author:Chuan Chen 阅读数:42102人阅读 分类: 构建工具

Output Configuration Detailed Explanation

The output configuration in Webpack determines how the bundled files are named, stored, and referenced. It controls the generation of bundles and directly affects the structure and loading behavior of the final output.

Basic Output Configuration

The most basic output configuration requires specifying two properties:

module.exports = {
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  }
}

path must be an absolute path, indicating the location of the output directory. filename specifies the name of the main entry file. When there are multiple entries, placeholders can be used:

module.exports = {
  entry: {
    app: './src/app.js',
    admin: './src/admin.js'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].bundle.js'
  }
}

Filename Placeholders

Webpack provides various placeholders for dynamically generating filenames:

  • [name]: Entry name
  • [hash]: Build hash value
  • [chunkhash]: Hash for each chunk
  • [id]: Chunk ID
  • [query]: Module query parameters
output: {
  filename: '[name].[chunkhash:8].js',
  chunkFilename: '[id].[chunkhash:8].chunk.js'
}

:8 indicates taking only the first 8 characters of the hash value. chunkFilename is used for naming non-entry chunk files.

Public Path Configuration

publicPath is crucial as it determines how these resources are accessed from the client:

output: {
  publicPath: '/assets/',
  path: path.resolve(__dirname, 'dist')
}

Assuming the final generated file is in dist/assets/main.js, then:

  • /assets/: The file will be accessed via /assets/main.js
  • ./: Relative path access
  • https://cdn.example.com/: Using a CDN address

Library Output Configuration

When bundling a library, the library options need to be configured:

output: {
  library: 'MyLibrary',
  libraryTarget: 'umd',
  globalObject: 'this'
}

libraryTarget supports various module schemes:

  • var: Exported as a variable
  • this: Mounted on this
  • window: Global variable in browser environments
  • umd: Universal Module Definition
  • commonjs2: CommonJS module

Advanced Output Configuration

Cleaning the Output Directory

Use the clean option to automatically clean the output directory:

output: {
  clean: true
}

Cross-Origin Loading Configuration

For resources that need cross-origin loading, configure crossOriginLoading:

output: {
  crossOriginLoading: 'anonymous'
}

Options:

  • false: Disabled
  • 'anonymous': Anonymous cross-origin requests
  • 'use-credentials': Cross-origin requests with credentials

Auxiliary Comments

Add banner or footer comments:

output: {
  banner: '/*! Version: 1.0.0 */',
  footer: '/* Built on: ' + new Date().toLocaleString() + ' */'
}

Multiple Configuration Outputs

In complex projects, different configurations may be needed for different environments:

module.exports = [{
  name: 'client',
  output: {
    path: path.resolve(__dirname, 'dist/client'),
    filename: 'client.bundle.js'
  }
}, {
  name: 'server',
  target: 'node',
  output: {
    path: path.resolve(__dirname, 'dist/server'),
    filename: 'server.bundle.js',
    libraryTarget: 'commonjs2'
  }
}]

Performance Optimization

Path Information

pathinfo controls whether module path information is included in the bundle:

output: {
  pathinfo: process.env.NODE_ENV === 'development'
}

Enable it in development for debugging and disable it in production to reduce size.

Long-Term Caching

Use contenthash for long-term caching:

output: {
  filename: '[name].[contenthash:8].js',
  chunkFilename: '[name].[contenthash:8].chunk.js'
}

Special Scenarios

Micro-Frontend Applications

In micro-frontend architectures, pay special attention to the public path:

output: {
  publicPath: 'http://localhost:3001/',
  jsonpFunction: 'webpackJsonp_childApp',
  uniqueName: 'childApp'
}

jsonpFunction and uniqueName avoid conflicts between multiple applications.

Web Worker Output

Configure output specifically for Web Workers:

output: {
  workerChunkLoading: 'import-scripts',
  workerWasmLoading: 'fetch'
}

Custom Output

Output behavior can be fully customized via plugins:

class CustomOutputPlugin {
  apply(compiler) {
    compiler.hooks.emit.tap('CustomOutput', (compilation) => {
      // Custom handling of compilation.assets
    });
  }
}

Modern Browser Optimization

Use module and nomodule for differential loading in modern/legacy browsers:

output: {
  filename: ({ chunk }) => {
    return chunk.name === 'modern' ? '[name].mjs' : '[name].js';
  }
}

Then in HTML:

<script type="module" src="modern.mjs"></script>
<script nomodule src="legacy.js"></script>

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

Front End Chuan

Front End Chuan, Chen Chuan's Code Teahouse 🍵, specializing in exorcising all kinds of stubborn bugs 💻. Daily serving baldness-warning-level development insights 🛠️, with a bonus of one-liners that'll make you laugh for ten years 🐟. Occasionally drops pixel-perfect romance brewed in a coffee cup ☕.