diff options
Diffstat (limited to 'electron/service/config/base.js')
| -rw-r--r-- | electron/service/config/base.js | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/electron/service/config/base.js b/electron/service/config/base.js new file mode 100644 index 00000000..8743f364 --- /dev/null +++ b/electron/service/config/base.js @@ -0,0 +1,126 @@ +'use strict' + +const { DefinePlugin, EnvironmentPlugin } = require('webpack') +const { VueLoaderPlugin } = require('vue-loader') +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin') +const HTMLPlugin = require('html-webpack-plugin') +const { VuetifyPlugin } = require('webpack-plugin-vuetify') + +const resolveClientEnv = require('../utils/resolveClientEnv') +const paths = require('../utils/paths') + +const config = require('../project.config') + +const isProd = process.env.NODE_ENV === 'production' + +module.exports = { + context: process.cwd(), + + output: { + path: paths.resolve(config.outputDir), + publicPath: config.dev.publicPath, + filename: '[name].js', + }, + + resolve: { + alias: { + '@': paths.resolve('src'), + }, + extensions: ['.ts', '.tsx', '.js', '.jsx', '.vue', '.json', 'html', 'ejs'], + }, + + plugins: [ + new VueLoaderPlugin(), + new EnvironmentPlugin(['NODE_ENV']), + new CaseSensitivePathsPlugin(), + new HTMLPlugin({ + template: paths.resolve('src/index.html'), + templateParameters: { + ...resolveClientEnv( + { publicPath: isProd ? config.build.publicPath : config.dev.publicPath }, + false /* raw */ + ), + }, + }), + new VuetifyPlugin({ autoImport: true }), + new DefinePlugin({ + // vue3 feature flags <http://link.vuejs.org/feature-flags> + __VUE_OPTIONS_API__: 'true', + __VUE_PROD_DEVTOOLS__: 'false', + + ...resolveClientEnv({ + publicPath: isProd ? config.build.publicPath : config.dev.publicPath, + }), + }), + ], + + module: { + noParse: /^(vue|vue-router)$/, + + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader', + }, + // babel + { + test: /\.m?jsx?$/, + exclude: (file) => { + // always transpile js in vue files + if (/\.vue\.jsx?$/.test(file)) { + return false + } + // Don't transpile node_modules + return /node_modules/.test(file) + }, + use: ['thread-loader', 'babel-loader'], + }, + + // ts + { + test: /\.tsx?$/, + use: [ + 'thread-loader', + 'babel-loader', + { + loader: 'ts-loader', + options: { + transpileOnly: true, + appendTsSuffixTo: ['\\.vue$'], + happyPackMode: true, + }, + }, + ], + }, + + // images + { + test: /\.(png|jpe?g|gif|webp)(\?.*)?$/, + type: 'asset', + generator: { filename: 'img/[contenthash:8][ext][query]' }, + }, + + // do not base64-inline SVGs. + // https://github.com/facebookincubator/create-react-app/pull/1180 + { + test: /\.(svg)(\?.*)?$/, + type: 'asset/resource', + generator: { filename: 'img/[contenthash:8][ext][query]' }, + }, + + // media + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + type: 'asset', + generator: { filename: 'media/[contenthash:8][ext][query]' }, + }, + + // fonts + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i, + type: 'asset', + generator: { filename: 'fonts/[contenthash:8][ext][query]' }, + }, + ], + }, +} |
