123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- 'use strict'
- process.env.BABEL_ENV = 'renderer'
- const path = require('path')
- const {
- dependencies
- } = require('../package.json')
- const webpack = require('webpack')
- const MinifyPlugin = require("babel-minify-webpack-plugin")
- const CopyWebpackPlugin = require('copy-webpack-plugin')
- const MiniCssExtractPlugin = require('mini-css-extract-plugin')
- const HtmlWebpackPlugin = require('html-webpack-plugin')
- const {
- VueLoaderPlugin
- } = require('vue-loader')
- /**
- * List of node_modules to include in webpack bundle
- *
- * Required for specific packages like Vue UI libraries
- * that provide pure *.vue files that need compiling
- * https://simulatedgreg.gitbooks.io/electron-vue/content/en/webpack-configurations.html#white-listing-externals
- */
- let whiteListedModules = ['vue', 'element-ui']
- let rendererConfig = {
- devtool: '#cheap-module-eval-source-map',
- entry: {
- renderer: path.join(__dirname, '../src/renderer/main.js')
- },
- externals: [
- ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))
- ],
- module: {
- rules: [
- // {
- // test: /\.(js|vue)$/,
- // enforce: 'pre',
- // exclude: /node_modules/,
- // use: {
- // loader: 'eslint-loader',
- // options: {
- // formatter: require('eslint-friendly-formatter')
- // }
- // }
- // },
- {
- test: /\.scss$/,
- use: ['vue-style-loader', 'css-loader', 'sass-loader']
- },
- {
- test: /\.sass$/,
- use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax']
- },
- {
- test: /\.less$/,
- use: ['vue-style-loader', 'css-loader', 'less-loader']
- },
- {
- test: /\.css$/,
- use: ['vue-style-loader', 'css-loader']
- },
- {
- test: /\.html$/,
- use: 'vue-html-loader'
- },
- {
- test: /\.js$/,
- use: 'babel-loader',
- exclude: /node_modules/
- },
- {
- test: /\.node$/,
- use: 'node-loader'
- },
- {
- test: /\.vue$/,
- use: {
- loader: 'vue-loader',
- options: {
- extractCSS: process.env.NODE_ENV === 'production',
- loaders: {
- sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
- scss: 'vue-style-loader!css-loader!sass-loader',
- less: 'vue-style-loader!css-loader!less-loader'
- }
- }
- }
- },
- {
- test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
- use: {
- loader: 'url-loader',
- query: {
- limit: 10000,
- name: 'imgs/[name]--[folder].[ext]'
- }
- }
- },
- {
- test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'media/[name]--[folder].[ext]'
- }
- },
- {
- test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
- use: {
- loader: 'url-loader',
- query: {
- limit: 10000,
- name: 'fonts/[name]--[folder].[ext]'
- }
- }
- }
- ]
- },
- node: {
- __dirname: process.env.NODE_ENV !== 'production',
- __filename: process.env.NODE_ENV !== 'production'
- },
- plugins: [
- new VueLoaderPlugin(),
- new MiniCssExtractPlugin({
- filename: 'styles.css'
- }),
- new HtmlWebpackPlugin({
- filename: 'index.html',
- template: path.resolve(__dirname, '../src/index.ejs'),
- templateParameters(compilation, assets, options) {
- return {
- compilation: compilation,
- webpack: compilation.getStats().toJson(),
- webpackConfig: compilation.options,
- htmlWebpackPlugin: {
- files: assets,
- options: options,
- },
- process,
- };
- },
- minify: {
- collapseWhitespace: true,
- removeAttributeQuotes: true,
- removeComments: true
- },
- nodeModules: process.env.NODE_ENV !== 'production' ?
- path.resolve(__dirname, '../node_modules') : false
- //nodeModules: path.resolve(__dirname, '../node_modules')
- }),
- new webpack.NoEmitOnErrorsPlugin()
- ],
- output: {
- filename: '[name].js',
- libraryTarget: 'commonjs2',
- path: path.join(__dirname, '../dist/electron')
- },
- resolve: {
- alias: {
- '@': path.join(__dirname, '../src/renderer'),
- 'vue$': 'vue/dist/vue.esm.js'
- },
- extensions: ['.js', '.vue', '.json', '.css', '.node']
- },
- target: 'electron-renderer'
- }
- /**
- * Adjust rendererConfig for development settings
- */
- if (process.env.NODE_ENV !== 'production') {
- rendererConfig.plugins.push(
- new webpack.HotModuleReplacementPlugin(),
- new webpack.DefinePlugin({
- '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
- })
- )
- }
- /**
- * Adjust rendererConfig for production settings
- */
- if (process.env.NODE_ENV === 'production') {
- rendererConfig.devtool = ''
- rendererConfig.plugins.push(
- new MinifyPlugin(),
- new CopyWebpackPlugin([{
- from: path.join(__dirname, '../static'),
- to: path.join(__dirname, '../dist/electron/static'),
- ignore: ['.*']
- }]),
- new webpack.DefinePlugin({
- 'process.env.NODE_ENV': '"production"'
- }),
- new webpack.LoaderOptionsPlugin({
- minimize: true
- })
- )
- }
- module.exports = rendererConfig
|