| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * @file test cron |
| * @author lpx |
| * @since 2020/08/19 |
| */ |
| const path = require('path'); |
| const paths = require('./paths'); |
| const HtmlWebpackPlugin = require('html-webpack-plugin'); |
| const {CleanWebpackPlugin} = require('clean-webpack-plugin'); |
| const transformerFactory = require('ts-import-plugin'); |
| const MiniCssExtractPlugin = require('mini-css-extract-plugin'); |
| const postCssLoader = () => { |
| return { |
| loader: 'postcss-loader', |
| options: { |
| plugins: [ |
| require('autoprefixer'), |
| require('cssnano') |
| ] |
| } |
| }; |
| }; |
| const devMode = process.env.NODE_ENV === 'dev'; |
| module.exports = { |
| // 入口文件 |
| entry: paths.entryApp, |
| output: { |
| path: paths.distSrc, |
| // publicPath: '', |
| filename: '[name].[hash].js', |
| chunkFilename: '[name].[hash].js' |
| }, |
| devtool: 'none', |
| resolve: { |
| extensions: ['*', '.ts', '.tsx', 'jsx', '.js', 'json'], |
| alias: { |
| Components: paths.Components, |
| Src: paths.Src, |
| Utils: paths.Utils, |
| Models: paths.Models, |
| Services: paths.Services, |
| Constants: paths.Constants, |
| '@hooks': paths['@hooks'] |
| } |
| }, |
| module: { |
| rules: [ |
| // { |
| // test: /\.ext$/, |
| // use: ['cache-loader'], |
| // include: path.resolve('src') |
| // }, |
| { |
| test: /\.(ts|tsx)$/, |
| exclude: /node_modules/, |
| include: paths.srcPath, |
| use: [ |
| 'cache-loader', |
| { |
| loader: 'ts-loader', |
| options: { |
| // disable type checker |
| transpileOnly: true, |
| // ts import plugin |
| getCustomTransformers: () => ({ |
| before: [ |
| transformerFactory({style: true}), |
| transformerFactory({ |
| style: false, |
| libraryName: 'lodash', |
| camel2DashComponentName: false |
| }) |
| ] |
| }), |
| compilerOptions: { |
| module: 'es2015' |
| } |
| } |
| }, |
| { |
| loader: 'thread-loader', |
| options: { |
| workers: 2 |
| } |
| } |
| ] |
| |
| }, |
| { |
| test: /\.(png|jpg|gif|ttf|eot|svg|woff|woff2)$/, |
| loader: 'url-loader', |
| options: { |
| limit: 1000 |
| } |
| }, |
| { |
| test: /\.css$/, |
| use: [ |
| devMode ? {loader: 'style-loader'} : MiniCssExtractPlugin.loader, |
| {loader: 'css-loader'}, |
| postCssLoader(), |
| { |
| loader: 'thread-loader', |
| options: { |
| workers: 2 |
| } |
| } |
| ] |
| }, |
| // For pure CSS (without CSS modules) |
| { |
| test: /\.less?$/, |
| include: /node_modules/, |
| use: [ |
| devMode ? {loader: 'style-loader'} : MiniCssExtractPlugin.loader, |
| { |
| loader: 'css-loader' |
| }, |
| postCssLoader(), |
| { |
| loader: 'less-loader', |
| options: { |
| // modifyVars: {...themes}, |
| javascriptEnabled: true |
| } |
| }, |
| { |
| loader: 'thread-loader', |
| options: { |
| workers: 2 |
| } |
| } |
| ] |
| }, |
| // For CSS modules |
| { |
| test: /\.less?$/, |
| exclude: /node_modules/, |
| use: [ |
| devMode ? {loader: 'style-loader'} : MiniCssExtractPlugin.loader, |
| { |
| loader: 'css-loader', |
| options: { |
| modules: true |
| } |
| }, |
| postCssLoader(), |
| { |
| loader: 'less-loader', |
| options: { |
| // modifyVars: {...themes}, |
| javascriptEnabled: true |
| } |
| }, |
| { |
| loader: 'thread-loader', |
| options: { |
| workers: 2 |
| } |
| } |
| ] |
| } |
| ] |
| }, |
| optimization: { |
| splitChunks: { |
| cacheGroups: { |
| commons: { |
| name: 'commons', |
| test: /[\\/]node_modules[\\/]/, |
| chunks: 'async', |
| minSize: 300000, |
| maxSize: 500000, |
| minChunks: 2 |
| }, |
| lodash: { |
| name: 'lodash', |
| chunks: 'all', |
| test: /lodash/, |
| minChunks: 2, |
| priority: 10 |
| }, |
| moment: { |
| name: 'moment', |
| chunks: 'all', |
| test: /moment/, |
| minChunks: 2, |
| priority: 10 |
| }, |
| codeMirror: { |
| name: 'codemirror', |
| chunks: 'all', |
| test: /codemirror/, |
| minChunks: 2, |
| priority: 10 |
| }, |
| styles: { |
| name: 'styles', |
| test: /\.(le|c)ss$/, |
| chunks: 'all', |
| enforce: true, |
| priority: 100, |
| minSize: 0, |
| maxSize: 30000000 |
| } |
| } |
| } |
| }, |
| // 配置相应的插件 |
| plugins: [ |
| new HtmlWebpackPlugin({ |
| template: './src/index.html', |
| inject: 'body', |
| favicon: './src/favicon.ico' |
| }), |
| new MiniCssExtractPlugin({ |
| filename: '[name].[hash].css', |
| ignoreOrder: true |
| }), |
| new CleanWebpackPlugin() |
| ] |
| }; |