blob: 252a47e735e9efbdca6db1f0f8e9d3e4a3357088 [file] [log] [blame]
huibing.xie1f1606f2018-08-20 15:46:55 +08001'use strict'
2const path = require('path')
3const utils = require('./utils')
4const config = require('../config')
5const vueLoaderConfig = require('./vue-loader.conf')
6
7function resolve (dir) {
8 return path.join(__dirname, '..', dir)
9}
10
11const createLintingRule = () => ({
12 test: /\.(js|vue)$/,
13 loader: 'eslint-loader',
14 enforce: 'pre',
15 include: [resolve('src'), resolve('test')],
16 options: {
17 formatter: require('eslint-friendly-formatter'),
18 emitWarning: !config.dev.showEslintErrorsInOverlay
19 }
20})
21
22module.exports = {
23 context: path.resolve(__dirname, '../'),
24 entry: {
25 app: ["babel-polyfill", "./src/main.js"]
26 },
27 output: {
28 path: config.build.assetsRoot,
29 filename: '[name].js',
30 publicPath: process.env.NODE_ENV === 'production'
31 ? config.build.assetsPublicPath
32 : config.dev.assetsPublicPath
33 },
34 resolve: {
35 extensions: ['.js', '.vue', '.json'],
36 alias: {
37 '@': resolve('src')
38 }
39 },
40 module: {
41 rules: [
42 ...(config.dev.useEslint ? [createLintingRule()] : []),
43 {
44 test: /\.vue$/,
45 loader: 'vue-loader',
46 options: vueLoaderConfig
47 },
48 {
49 test: /\.js$/,
50 loader: 'babel-loader',
51 include: [resolve('src'), resolve('test') ,resolve('node_modules/webpack-dev-server/client')]
52 },
53 {
54 test: /\.svg$/,
55 loader: 'svg-sprite-loader',
56 include: [resolve('src/icons')],
57 options: {
58 symbolId: 'icon-[name]'
59 }
60 },
61 {
62 test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
63 loader: 'url-loader',
64 exclude: [resolve('src/icons')],
65 options: {
66 limit: 10000,
67 name: utils.assetsPath('img/[name].[hash:7].[ext]')
68 }
69 },
70 {
71 test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
72 loader: 'url-loader',
73 options: {
74 limit: 10000,
75 name: utils.assetsPath('media/[name].[hash:7].[ext]')
76 }
77 },
78 {
79 test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
80 loader: 'url-loader',
81 options: {
82 limit: 10000,
83 name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
84 }
85 }
86 ]
87 },
88 node: {
89 // prevent webpack from injecting useless setImmediate polyfill because Vue
90 // source contains it (although only uses it if it's native).
91 setImmediate: false,
92 // prevent webpack from injecting mocks to Node native modules
93 // that does not make sense for the client
94 dgram: 'empty',
95 fs: 'empty',
96 net: 'empty',
97 tls: 'empty',
98 child_process: 'empty'
99 }
100}