| 'use strict' |
| const path = require('path') |
| const utils = require('./utils') |
| const config = require('../config') |
| const vueLoaderConfig = require('./vue-loader.conf') |
| |
| function resolve (dir) { |
| return path.join(__dirname, '..', dir) |
| } |
| |
| const createLintingRule = () => ({ |
| test: /\.(js|vue)$/, |
| loader: 'eslint-loader', |
| enforce: 'pre', |
| include: [resolve('src'), resolve('test')], |
| options: { |
| formatter: require('eslint-friendly-formatter'), |
| emitWarning: !config.dev.showEslintErrorsInOverlay |
| } |
| }) |
| |
| module.exports = { |
| context: path.resolve(__dirname, '../'), |
| entry: { |
| app: './src/main.ts' |
| }, |
| output: { |
| path: config.build.assetsRoot, |
| filename: '[name].js', |
| publicPath: process.env.NODE_ENV === 'production' |
| ? config.build.assetsPublicPath |
| : config.dev.assetsPublicPath |
| }, |
| resolve: { |
| extensions: ['.js', '.vue', '.json', '.ts', '.jsx'], |
| alias: { |
| // 'vue$': 'vue/dist/vue.esm.js', |
| '@': resolve('src'), |
| } |
| }, |
| module: { |
| rules: [ |
| ...(config.dev.useEslint ? [createLintingRule()] : []), |
| { |
| test: /\.vue$/, |
| loader: 'vue-loader', |
| options: vueLoaderConfig |
| }, |
| { |
| test: /\.js$/, |
| loader: 'babel-loader', |
| include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] |
| }, |
| { |
| test: /\.ts$/, |
| exclude: /node_modules/, |
| enforce: 'pre', |
| loader: 'tslint-loader' |
| }, |
| { |
| test: /\.tsx?$/, |
| loader: 'ts-loader', |
| exclude: /node_modules/, |
| options: { |
| appendTsSuffixTo: [/\.vue$/], |
| } |
| }, |
| { |
| test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, |
| loader: 'url-loader', |
| options: { |
| limit: 1, |
| name: utils.assetsPath('img/[name].[hash:7].[ext]') |
| } |
| }, |
| { |
| test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, |
| loader: 'url-loader', |
| options: { |
| limit: 1, |
| name: utils.assetsPath('media/[name].[hash:7].[ext]') |
| } |
| }, |
| { |
| test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, |
| loader: 'url-loader', |
| options: { |
| limit: 1, |
| name: utils.assetsPath('fonts/[name].[hash:7].[ext]') |
| } |
| } |
| ] |
| }, |
| node: { |
| // prevent webpack from injecting useless setImmediate polyfill because Vue |
| // source contains it (although only uses it if it's native). |
| setImmediate: false, |
| // prevent webpack from injecting mocks to Node native modules |
| // that does not make sense for the client |
| dgram: 'empty', |
| fs: 'empty', |
| net: 'empty', |
| tls: 'empty', |
| child_process: 'empty' |
| } |
| } |