Fading Coder

One Final Commit for the Last Sprint

Home > Notes > Content

Advanced Configuration Strategies for vue.config.js in Vue Applications

Notes 1

Path Resolution Utility

Node.js includes the built-in path module to handle file system paths consistently across different operating systems. Creating a dedicated resolver function eliminates relative path confusion during build configuration.

const path = require('path');

const buildPath = (relativeDir) => path.join(__dirname, relativeDir);

The __dirname global variable references the absolute directory containing the current configuration file. Passing a relative directory string to path.join generates a predictable absolute path, which streamlines alias definitions and loader targeting throughout the build pipeline.

Core Build & Environment Settings

The primary configuration object defines output directories, source map generation, and linting behavior based on the active environment.

module.exports = {
  publicPath: '/',
  outputDir: 'dist_build',
  assetsDir: 'static_assets',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  // ... additional configuration
};

Disabling productionSourceMap reduces final bundle size and accelerates the compilation process. Restricting lintOnSave to development environments prevents unnecessary validation overhead during production builds.

Development Server & API Proxy

Local development routing and cross-origin request handling are managed through the devServer property.

  devServer: {
    port: 8085,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    proxy: {
      '/svc': {
        target: 'http://10.0.0.50:7000',
        changeOrigin: true,
        pathRewrite: { '^/svc': '' }
      }
    }
  },

The proxy configuration intercepts local requests matching the /svc prefix and forwards them to the specified backend target. Setting changeOrigin to true modifies request header's host field to match the target server, bypassing CORS restrictions during local development. The pathRewrite rule strips the prefix before forwarding the request.

Webpack Resolution & Aliases

Custom module resolution paths are injected via configureWebpack, allowing shorter import statements throughout the application.

  configureWebpack: {
    name: 'enterprise-dashboard',
    resolve: {
      alias: {
        '@app': buildPath('src'),
        '@shared': buildPath('src/shared')
      }
    }
  },

Mapping @app to the source root eliminates deep relative imports, improving code readabiltiy and refactoring safety.

Advanced Chaining & Production Optimization

The chainWebpack method provides granular control over the internal Webpack configuration using a fluent API. This section handles resource preloading, SVG sprite generation, and aggressive code splitting.

  chainWebpack: (config) => {
    config.plugin('preload').tap((args) => {
      args[0].rel = 'preload';
      args[0].fileBlacklist = [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/];
      args[0].include = 'initial';
      return args;
    });

    config.plugins.delete('prefetch');

    config.module
      .rule('svg')
      .exclude.add(buildPath('src/icons'))
      .end();

    config.module
      .rule('svg-sprite')
      .test(/\.svg$/)
      .include.add(buildPath('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({ symbolId: 'icon-[name]' })
      .end();

    config.when(process.env.NODE_ENV === 'production', (prodConfig) => {
      prodConfig
        .plugin('ScriptExtHtmlWebpackPlugin')
        .after('html')
        .use('script-ext-html-webpack-plugin', [{ inline: /runtime\..*\.js$/ }])
        .end();

      prodConfig.optimization.splitChunks({
        chunks: 'all',
        cacheGroups: {
          dependencies: {
            name: 'chunk-vendors',
            test: /[\\/]node_modules[\\/]/,
            priority: 10,
            chunks: 'initial'
          },
          uiLibrary: {
            name: 'chunk-ui-framework',
            priority: 20,
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/
          },
          commonModules: {
            name: 'chunk-common',
            test: buildPath('src/components'),
            minChunks: 3,
            priority: 5,
            reuseExistingChunk: true
          }
        }
      });

      prodConfig.optimization.runtimeChunk('single');
    });
  }
};

Removing prefetch prevents the browser from downloading unnecessary route chunks on initial load, conserving bandwidth. The SVG configuration excludes the icons directory from the default file loader and processes it exclusively with svg-sprite-loader, compiling individual icons into a single sprite sheet with predictable symbol IDs.

Production builds leverage splitChunks to isolate third-party libraries, UI frameworks, and frequently used internal components into separate cache groups. Assigning higher priority values ensures specific packages like UI frameworks are extracted before generic node_modules dependencies. Inlining the Webpack runtime chunk via script-ext-html-webpack-plugin reduces addisional HTTP requests, while runtimeChunk('single') extracts the manifest into a dedicated file for improved long-term caching.

Related Articles

Designing Alertmanager Templates for Prometheus Notifications

How to craft Alertmanager templates to format alert messages, improving clarity and presentation. Alertmanager uses Go’s text/template engine with additional helper functions. Alerting rules referenc...

Deploying a Maven Web Application to Tomcat 9 Using the Tomcat Manager

Tomcat 9 does not provide a dedicated Maven plugin. The Tomcat Manager interface, however, is backward-compatible, so the Tomcat 7 Maven Plugin can be used to deploy to Tomcat 9. This guide shows two...

Skipping Errors in MySQL Asynchronous Replication

When a replica halts because the SQL thread encounters an error, you can resume replication by skipping the problematic event(s). Two common approaches are available. Methods to Skip Errors 1) Skip a...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.