Skip to content
Snippets Groups Projects
webpack.config.js 2.41 KiB
const path = require('path');
const webpack = require('webpack');
const BundleTracker = require('webpack-bundle-tracker');
const { VueLoaderPlugin } = require('vue-loader');
const ESLintPlugin = require('eslint-webpack-plugin');
const StyleLintPlugin = require('stylelint-webpack-plugin');

module.exports = {
  context: __dirname,
  entry: {
    core: './assets/index',
    alsijil: {
      dependOn: 'core',
      import: '../AlekSIS-App-Alsijil/assets/js/vue/alsijil/LoadComponents',
    },
  },
  output: {
    path: path.resolve('./assets/webpack_bundles/'),
    filename: "[name]-[hash].js",
    chunkFilename: "[id]-[chunkhash].js",
  },
  plugins: [
    new BundleTracker({filename: './webpack-stats.json'}),
    new VueLoaderPlugin(),
    new ESLintPlugin({
      extensions: ["js", "vue"],
    }),
    new StyleLintPlugin({
      files: ['assets/**/*.{vue,htm,html,css,sss,less,scss,sass}'],
    }),
  ],
  module: {
    rules: [
      {
        test: /\.vue$/,
        use: {
          loader: 'vue-loader',
          options: {
            transpileOptions: {
              transforms: {
                dangerousTaggedTemplateString: true
              }
            }
          }
        },
      },
      {
        test: /\.(css)$/,
        use: ['vue-style-loader', 'css-loader'],
      },
      {
        test: /\.s(c|a)ss$/,
        use: [
          'vue-style-loader',
          'css-loader',
          {
            loader: 'sass-loader',
            options: {
              implementation: require('sass'),
              sassOptions: {
                indentedSyntax: true
              },
            },
          },
        ],
      },
    ],
  },
  optimization: {
    runtimeChunk: "single",
    splitChunks: {
      chunks: "all",
      maxInitialRequests: Infinity,
      minSize: 0,
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name(module) {
            // get the name. E.g. node_modules/packageName/not/this/part.js
            // or node_modules/packageName
            const packageName = module.context.match(
              /[\\/]node_modules[\\/](.*?)([\\/]|$)/
            )[1];

            // npm package names are URL-safe, but some servers don't like @ symbols
            return `npm.${packageName.replace("@", "")}`;
          }
        }
      }
    }
  },
  resolve: {
    modules: [path.resolve('./node_modules')],
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  },
}