Skip to content
Snippets Groups Projects
webpack.config.js 7.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • var fs = require('fs');
    
    var path = require('path');
    var webpack = require('webpack');
    var StatsPlugin = require('stats-webpack-plugin');
    
    var CompressionPlugin = require('compression-webpack-plugin');
    
    var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
    
    var WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
    
    var ROOT_PATH = path.resolve(__dirname, '..');
    
    var IS_PRODUCTION = process.env.NODE_ENV === 'production';
    
    var IS_DEV_SERVER = process.argv[1].indexOf('webpack-dev-server') !== -1;
    
    var DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost';
    
    var DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10) || 3808;
    
    var DEV_SERVER_LIVERELOAD = process.env.DEV_SERVER_LIVERELOAD !== 'false';
    
    var WEBPACK_REPORT = process.env.WEBPACK_REPORT;
    
      // because sqljs requires fs.
      node: {
        fs: "empty"
      },
    
      context: path.join(ROOT_PATH, 'app/assets/javascripts'),
    
        blob:                 './blob_edit/blob_bundle.js',
        boards:               './boards/boards_bundle.js',
    
        common:               './commons/index.js',
    
        common_vue:           ['vue', './vue_shared/common_vue.js'],
    
        cycle_analytics:      './cycle_analytics/cycle_analytics_bundle.js',
    
        commit_pipelines:     './commit/pipelines/pipelines_bundle.js',
    
        deploy_keys:          './deploy_keys/index.js',
    
        diff_notes:           './diff_notes/diff_notes_bundle.js',
        environments:         './environments/environments_bundle.js',
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
        environments_folder:  './environments/folder/environments_folder_bundle.js',
    
        filtered_search:      './filtered_search/filtered_search_bundle.js',
    
        graphs:               './graphs/graphs_bundle.js',
    
        group:                './group.js',
    
        groups_list:          './groups_list.js',
    
        issue_show:           './issue_show/index.js',
    
    Phil Hughes's avatar
    Phil Hughes committed
        locale:               './locale/index.js',
    
        main:                 './main.js',
    
        merge_conflicts:      './merge_conflicts/merge_conflicts_bundle.js',
    
        monitoring:           './monitoring/monitoring_bundle.js',
    
        network:              './network/network_bundle.js',
    
        notebook_viewer:      './blob/notebook_viewer.js',
    
        pdf_viewer:           './blob/pdf_viewer.js',
    
        pipelines:            './pipelines/index.js',
    
    Jacob Schatz's avatar
    Jacob Schatz committed
        balsamiq_viewer:      './blob/balsamiq_viewer.js',
    
        pipelines_graph:      './pipelines/graph_bundle.js',
    
        profile:              './profile/profile_bundle.js',
        protected_branches:   './protected_branches/protected_branches_bundle.js',
    
        protected_tags:       './protected_tags',
    
        sidebar:              './sidebar/sidebar_bundle.js',
    
        schedule_form:        './pipeline_schedules/pipeline_schedule_form_bundle.js',
        schedules_index:      './pipeline_schedules/pipeline_schedules_index_bundle.js',
    
        snippet:              './snippet/snippet_bundle.js',
    
        sketch_viewer:        './blob/sketch_viewer.js',
    
    Phil Hughes's avatar
    Phil Hughes committed
        stl_viewer:           './blob/stl_viewer.js',
    
        terminal:             './terminal/terminal_bundle.js',
    
        u2f:                  ['vendor/u2f'],
    
        users:                './users/users_bundle.js',
    
        vue_merge_request_widget: './vue_merge_request_widget/index.js',
    
      },
    
      output: {
        path: path.join(ROOT_PATH, 'public/assets/webpack'),
        publicPath: '/assets/webpack/',
    
        filename: IS_PRODUCTION ? '[name].[chunkhash].bundle.js' : '[name].bundle.js'
    
      devtool: 'cheap-module-source-map',
    
      module: {
    
    Mike Greiling's avatar
    Mike Greiling committed
        rules: [
    
            exclude: /(node_modules|vendor\/assets)/,
    
    Mike Greiling's avatar
    Mike Greiling committed
            loader: 'babel-loader',
    
    Mike Greiling's avatar
    Mike Greiling committed
            loader: 'vue-loader',
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          {
            test: /\.svg$/,
    
    Mike Greiling's avatar
    Mike Greiling committed
            loader: 'raw-loader',
          },
    
    Sam Rose's avatar
    Sam Rose committed
          {
            test: /\.gif$/,
            loader: 'url-loader',
            query: { mimetype: 'image/gif' },
          },
    
    Mike Greiling's avatar
    Mike Greiling committed
          {
            test: /\.(worker\.js|pdf)$/,
    
            exclude: /node_modules/,
            loader: 'file-loader',
          },
    
          {
            test: /locale\/[a-z]+\/(.*)\.js$/,
            loader: 'exports-loader?locales',
          },
    
      plugins: [
        // manifest filename must match config.webpack.manifest_filename
        // webpack-rails only needs assetsByChunkName to function properly
        new StatsPlugin('manifest.json', {
          chunkModules: false,
          source: false,
          chunks: false,
          modules: false,
          assets: true
    
    Phil Hughes's avatar
    Phil Hughes committed
        }),
    
    Mike Greiling's avatar
    Mike Greiling committed
    
        // prevent pikaday from including moment.js
    
    Phil Hughes's avatar
    Phil Hughes committed
        new webpack.IgnorePlugin(/moment/, /pikaday/),
    
        // fix legacy jQuery plugins which depend on globals
        new webpack.ProvidePlugin({
          $: 'jquery',
          jQuery: 'jquery',
        }),
    
    
        // use deterministic module ids in all environments
        IS_PRODUCTION ?
          new webpack.HashedModuleIdsPlugin() :
          new webpack.NamedModulesPlugin(),
    
        // create cacheable common library bundle for all vue chunks
        new webpack.optimize.CommonsChunkPlugin({
          name: 'common_vue',
          chunks: [
            'boards',
            'commit_pipelines',
            'cycle_analytics',
    
    Phil Hughes's avatar
    Phil Hughes committed
            'deploy_keys',
    
            'diff_notes',
            'environments',
            'environments_folder',
    
            'notebook_viewer',
    
            'pdf_viewer',
    
            'pipelines_graph',
    
          minChunks: function(module, count) {
            return module.resource && (/vue_shared/).test(module.resource);
          },
    
        // create cacheable common library bundle for all d3 chunks
        new webpack.optimize.CommonsChunkPlugin({
          name: 'common_d3',
    
        new webpack.optimize.CommonsChunkPlugin({
    
          names: ['main', 'common', 'runtime'],
    
    
        // locale common library
        new webpack.optimize.CommonsChunkPlugin({
          name: 'locale',
          chunks: [
            'cycle_analytics',
          ],
        }),
    
          '~':              path.join(ROOT_PATH, 'app/assets/javascripts'),
    
          'emojis':         path.join(ROOT_PATH, 'fixtures/emojis'),
    
          'empty_states':   path.join(ROOT_PATH, 'app/views/shared/empty_states'),
    
          'icons':          path.join(ROOT_PATH, 'app/views/shared/icons'),
    
          'vendor':         path.join(ROOT_PATH, 'vendor/assets/javascripts'),
    
          'vue$':           'vue/dist/vue.esm.js',
    
      config.devtool = 'source-map';
    
        new webpack.NoEmitOnErrorsPlugin(),
    
    Mike Greiling's avatar
    Mike Greiling committed
        new webpack.LoaderOptionsPlugin({
          minimize: true,
          debug: false
        }),
    
        new webpack.optimize.UglifyJsPlugin({
    
    Mike Greiling's avatar
    Mike Greiling committed
          sourceMap: true
    
        }),
        new webpack.DefinePlugin({
          'process.env': { NODE_ENV: JSON.stringify('production') }
    
        }),
        new CompressionPlugin({
          asset: '[path].gz[query]',
    
    Mike Greiling's avatar
    Mike Greiling committed
        })
    
      config.devtool = 'cheap-module-eval-source-map';
    
        headers: { 'Access-Control-Allow-Origin': '*' },
        stats: 'errors-only',
    
      config.output.publicPath = '//' + DEV_SERVER_HOST + ':' + DEV_SERVER_PORT + config.output.publicPath;
    
      config.plugins.push(
        // watch node_modules for changes if we encounter a missing module compile error
        new WatchMissingNodeModulesPlugin(path.join(ROOT_PATH, 'node_modules'))
      );
    
    if (WEBPACK_REPORT) {
      config.plugins.push(
        new BundleAnalyzerPlugin({
          analyzerMode: 'static',
          generateStatsFile: true,
          openAnalyzer: false,
          reportFilename: path.join(ROOT_PATH, 'webpack-report/index.html'),
          statsFilename: path.join(ROOT_PATH, 'webpack-report/stats.json'),
        })
      );
    }