webpack.base.babel.js 6.87 KB
Newer Older
Julien Benchetrit's avatar
Julien Benchetrit committed
1 2
const path = require('path');
const webpack = require('webpack');
dengxiaofeng's avatar
dengxiaofeng committed
3
const slash = require('slash2');
4
const CopyPlugin = require('copy-webpack-plugin');
5
const cesiumSource = './node_modules/cesium/Build/Cesium';
邓晓峰's avatar
邓晓峰 committed
6 7
const FastRefreshPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
const nodeLibs = require('node-libs-browser');
8
console.log();
Julien Benchetrit's avatar
Julien Benchetrit committed
9 10 11 12 13
module.exports = options => ({
  mode: options.mode,
  entry: options.entry,
  output: Object.assign(
    {
tianfen's avatar
tianfen committed
14 15 16
      path: process.env.npm_config_releasepath
        ? path.resolve(process.env.npm_config_releasepath, 'civmanage')
        : path.resolve(process.cwd(), 'civmanage'),
邓晓峰's avatar
邓晓峰 committed
17
      publicPath: process.env.PUBLIC_PATH || '/civmanage/',
18
      sourcePrefix: '', // 需要编译Cesium中的多行字符串
Julien Benchetrit's avatar
Julien Benchetrit committed
19 20 21 22
    },
    options.output,
  ), // Merge with env dependent settings
  optimization: options.optimization,
23
  amd: {
24 25
    // 允许Cesium兼容 webpack的require方式
    toUrlUndefined: true,
26
  },
Julien Benchetrit's avatar
Julien Benchetrit committed
27 28 29
  module: {
    rules: [
      {
30
        test: /\.[jt]sx?$/,
Julien Benchetrit's avatar
Julien Benchetrit committed
31 32 33
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
邓晓峰's avatar
邓晓峰 committed
34 35 36 37 38
          options: options.babelQuery,
          // options: {
          //   presets: ['@babel/preset-typescript'],
          //   plugins: ['@babel/plugin-proposal-optional-chaining'],
          // },
Julien Benchetrit's avatar
Julien Benchetrit committed
39 40 41 42 43 44 45 46 47 48 49
        },
      },
      {
        // Preprocess our own .css files
        // This is the place to add your own loaders (e.g. sass/less etc.)
        // for a list of loaders, see https://webpack.js.org/loaders/#styling
        test: /\.css$/,
        exclude: /node_modules/,
        use: ['style-loader', 'css-loader'],
      },
      {
dengxiaofeng's avatar
dengxiaofeng committed
50 51 52 53 54 55 56 57
        test: /\.less$/,

        use: [
          {
            loader: 'style-loader',
          },
          {
            loader: 'css-loader',
dengxiaofeng's avatar
dengxiaofeng committed
58 59 60 61 62 63 64 65 66 67 68 69
            options: {
              modules: {
                // localIdentName: '[name]__[local]___[hash:base64:5]'
                // modules: true,
                getLocalIdent: (context, _, localName) => {
                  if (
                    context.resourcePath.includes('node_modules') ||
                    context.resourcePath.includes('ant.design.pro.less') ||
                    context.resourcePath.includes('global.less')
                  ) {
                    return localName;
                  }
张烨's avatar
张烨 committed
70

dengxiaofeng's avatar
dengxiaofeng committed
71
                  const match = context.resourcePath.match(/src(.*)/);
72 73
                  const matchAntd = /^ant/.test(localName);
                  if (match && match[1] && !matchAntd) {
dengxiaofeng's avatar
dengxiaofeng committed
74 75 76 77 78
                    const antdProPath = match[1].replace('.less', '');
                    const arr = slash(antdProPath)
                      .split('/')
                      .map(a => a.replace(/([A-Z])/g, '-$1'))
                      .map(a => a.toLowerCase());
邓超's avatar
邓超 committed
79
                    return `panda-pro${arr.join('-')}-${localName}`.replace(/--/g, '-');
dengxiaofeng's avatar
dengxiaofeng committed
80
                  }
张烨's avatar
张烨 committed
81

dengxiaofeng's avatar
dengxiaofeng committed
82 83
                  return localName;
                },
张烨's avatar
张烨 committed
84
              },
dengxiaofeng's avatar
dengxiaofeng committed
85
            },
dengxiaofeng's avatar
dengxiaofeng committed
86 87 88 89 90 91 92 93 94 95
          },
          {
            loader: 'less-loader',
            options: {
              javascriptEnabled: true,
            },
          },
        ],
      },
      {
Julien Benchetrit's avatar
Julien Benchetrit committed
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
        test: /\.css$/,
        include: /node_modules/,
        use: ['style-loader', 'css-loader'],
      },
      {
        test: /\.(eot|otf|ttf|woff|woff2)$/,
        use: 'file-loader',
      },
      {
        test: /\.svg$/,
        use: [
          {
            loader: 'svg-url-loader',
            options: {
              // Inline files smaller than 10 kB
              limit: 10 * 1024,
              noquotes: true,
            },
          },
        ],
      },
      {
        test: /\.(jpg|png|gif)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // Inline files smaller than 10 kB
              limit: 10 * 1024,
邓晓峰's avatar
邓晓峰 committed
125
              outputPath: 'assets/',
邓晓峰's avatar
邓晓峰 committed
126
              // name: '[name].[ext]'
Julien Benchetrit's avatar
Julien Benchetrit committed
127 128
            },
          },
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
          // {
          //   loader: 'image-webpack-loader',
          //   options: {
          //     mozjpeg: {
          //       enabled: false,
          //       // NOTE: mozjpeg is disabled as it causes errors in some Linux environments
          //       // Try enabling it in your environment by switching the config to:
          //       // enabled: true,
          //       // progressive: true,
          //     },
          //     gifsicle: {
          //       interlaced: false,
          //     },
          //     optipng: {
          //       optimizationLevel: 7,
          //     },
          //     pngquant: {
          //       quality: '65-90',
          //       speed: 4,
          //     },
          //   },
          // },
Julien Benchetrit's avatar
Julien Benchetrit committed
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
        ],
      },
      {
        test: /\.html$/,
        use: 'html-loader',
      },
      {
        test: /\.(mp4|webm)$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 10000,
          },
        },
      },
    ],
  },
  plugins: options.plugins.concat([
    // Always expose NODE_ENV to webpack, in order to use `process.env.NODE_ENV`
    // inside your code for any environment checks; Terser will automatically
    // drop any unreachable code.
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'development',
    }),
175

邓晓峰's avatar
邓晓峰 committed
176
    new webpack.ProvidePlugin({
邓超's avatar
邓超 committed
177
      process: nodeLibs.process,
邓晓峰's avatar
邓晓峰 committed
178 179
    }),
    new FastRefreshPlugin({
邓超's avatar
邓超 committed
180
      overlay: false,
邓晓峰's avatar
邓晓峰 committed
181
    }),
182 183 184 185
    new CopyPlugin([
      {
        from: path.resolve(process.cwd(), './public'),
      },
186
      {
187
        from: path.join(process.cwd(), cesiumSource, 'Workers'),
188 189 190 191 192 193 194 195 196 197 198 199 200 201
        to: 'Workers',
      },
      {
        from: path.join(process.cwd(), cesiumSource, 'Assets'),
        to: 'Assets',
      },
      {
        from: path.join(process.cwd(), cesiumSource, 'Widgets'),
        to: 'Widgets',
      },
      {
        from: path.join(process.cwd(), cesiumSource, 'ThirdParty'),
        to: 'ThirdParty',
      },
202
    ]),
203

204 205 206
    new webpack.DefinePlugin({
      CESIUM_BASE_URL: JSON.stringify('/civmanage'), // 定义packName
    }),
Julien Benchetrit's avatar
Julien Benchetrit committed
207 208
  ]),
  resolve: {
dengxiaofeng's avatar
dengxiaofeng committed
209
    modules: ['node_modules', 'src'],
210
    extensions: ['.js', '.jsx', '.react.js', '.ts', '.tsx'],
Julien Benchetrit's avatar
Julien Benchetrit committed
211
    mainFields: ['browser', 'jsnext:main', 'main'],
212 213 214
    alias: {
      '@': path.resolve(process.cwd(), './src'),
      components: path.resolve(process.cwd(), './src/components'),
皮倩雯's avatar
皮倩雯 committed
215
      cesium: path.resolve(process.cwd(), cesiumSource),
邓晓峰's avatar
邓晓峰 committed
216
      react: path.resolve(process.cwd(), './node_modules/react'),
邓超's avatar
邓超 committed
217 218 219 220
      '@esri/arcgis-html-sanitizer': path.resolve(
        process.cwd(),
        './node_modules/@esri/arcgis-html-sanitizer/dist/esm/index.js',
      ),
邓晓峰's avatar
邓晓峰 committed
221 222 223 224 225 226 227 228 229 230 231 232
    },
    fallback: {
      ...Object.keys(nodeLibs).reduce((memo, key) => {
        if (nodeLibs[key]) {
          memo[key] = nodeLibs[key];
        } else {
          memo[key] = false;
        }
        return memo;
      }, {}),
      http: false,
      https: false,
233
    },
Julien Benchetrit's avatar
Julien Benchetrit committed
234 235 236 237 238
  },
  devtool: options.devtool,
  target: 'web', // Make web variables accessible to webpack, e.g. window
  performance: options.performance || {},
});