const fs = require('fs'); const path = require('path'); const webpack = require('webpack'); const slash = require('slash'); module.exports = { mode: 'development', devtool: 'source-map', entry: fs.readdirSync(__dirname).reduce((entries, dir) => { const fullDir = path.join(__dirname, dir); const entry = path.join(fullDir, 'app.js'); if (fs.statSync(fullDir).isDirectory() && fs.existsSync(entry)) { entries[dir] = ['webpack-hot-middleware/client', entry]; } return entries; }, {}), output: { path: path.join(__dirname, '__build__'), filename: '[name].js', publicPath: '/__build__/', }, module: { rules: [ { test: /\.jsx?$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { sourceType: 'unambiguous', babelrc: false, cacheDirectory: false, presets: [ [ '@babel/preset-env', { targets: { browsers: 'defaults' }, }, ], '@babel/preset-react', ], plugins: [ '@babel/plugin-syntax-jsx', '@babel/plugin-syntax-dynamic-import', '@babel/plugin-transform-modules-amd', [ 'babel-plugin-import', { libraryName: 'antd', libraryDirectory: 'es', style: true, }, ], ['@babel/plugin-proposal-private-methods', { loose: true }], ['@babel/plugin-proposal-private-property-in-object', { loose: true }], ['@babel/plugin-proposal-class-properties', { loose: true }], ], }, }, }, { test: /\.css$/, //exclude: /node_modules/, use: ['style-loader', 'css-loader'], }, { test: /\.less$/, use: [ { loader: 'style-loader', }, { loader: 'css-loader', options: { modules: { getLocalIdent: (context, _, localName) => { const match = context.resourcePath.match(/src(.*)/); const matchAntd = /^ant/.test(localName); if (context.resourcePath.includes('wisdom-map')) { if (match && match[1] && !matchAntd) { const antdProPath = match[1].replace('.less', ''); const arr = slash(antdProPath) .split('/') .map(a => a.replace(/([A-Z])/g, '-$1')) .map(a => a.toLowerCase()); return `pandaXform-${arr.join('-')}-${localName}`.replace(/--/g, '-'); } } return localName; }, }, }, }, { loader: 'less-loader', options: { javascriptEnabled: true, }, }, ], }, { 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: { limit: 10 * 1024, }, }, ], }, { test: /\.html$/, use: 'html-loader', }, { test: /\.(mp4|webm)$/, use: { loader: 'url-loader', options: { limit: 10000, }, }, }, ], }, resolve: { extensions: ['.jsx', '.js'], }, plugins: [new webpack.HotModuleReplacementPlugin(), new webpack.NoEmitOnErrorsPlugin()], };