1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| 这里这个配置里面只配置了.js、.vue、图片、字体等几类文件的处理规则,如果需要处理其他文件可以在module.rules里面另行配置。从代码中看到,dev-server使用的webpack配置来自build/webpack.dev.conf.js文件(测试环境下使用的是build/webpack.prod.conf.js,这里暂时不考虑测试环境)。而build/webpack.dev.conf.js中又引用了webpack.base.conf.js,所以这里先看webpack.base.conf.js。 webpack.base.conf.js主要完成下面的操作: 配置webpack编译入口; 配置webpack输出路径和命名规则; 配置模块resolve规则; 配置不同类型模块的处理规则。 '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: { // 配置webpack编译入口。 app: './src/main.js' }, // 配置webpack输出路径和命名规则。 output: { // webpack输出的目标文件夹路径(例如:/dist) path: config.build.assetsRoot, // webpack输出bundle文件命名格式。 filename: '[name].js', // webpack编译输出的发布路径。 publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath }, // 配置模块resolve的规则。 resolve: { // 自动resolve的扩展名。 extensions: ['.js', '.vue', '.json'], // 创建路径别名,有了别名之后引用模块更方便,例如:import Vue from 'vue/dist/vue.esm.js'可以写成 import Vue from 'vue'。 alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), } }, // 配置不同类型模块的处理规则。 module: { rules: [ ...(config.dev.useEslint ? [createLintingRule()] : []), // 对所有.vue文件使用vue-loader { test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, // 对src和test文件夹下的.js文件使用babel-loader。 { test: /\.js$/, loader: 'babel-loader', include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] }, // 对图片资源文件使用url-loader,name指明了输出的命名规则。 { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } }, // 对媒体资源文件使用url-loader,name指明了输出的命名规则。 { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('media/[name].[hash:7].[ext]') } }, // 对字体资源文件使用url-loader,name指明了输出的命名规则。 { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, 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' } }
|