总结vue-cli中的webpack配置

webpack admin 暂无评论

webpack简介

随着移动互联的浪潮到来,Webapp模式、SPA受到越来越多的关注。如何在开发环境中组织好碎片化、多格式的代码和资源,并保证他们在浏览器端快速、优雅地加载和更新需要一个模块化的系统。

Webpack就是这样的模块化系统。它有以下几个特点:

  • 分块传输,按需进行懒加载;

  • 各种格式的资源都是JavaScript模块,可以用require加载;

  • 对代码进行静态分析,分析各模块的类型和依赖关系并交给适合的加载器处理。

具体地说,Webpack的配置主要包括这几个方面:

  • 入口:指定我们代码的入口点。它的值是一个字符串或者一个对象(多个入口)。

  • 加载器:因为Webpack本身只能处理JavaScript模块,如果要处理其他类型的文件,就需要使用 loader(加载器)进行转换。加载器将资源转换成JavaScript模块,在打包之前提供预处理。

  • 插件:提供加载器无法做到的其他扩展功能。

  • 出口:包括打包后的文件放置的路径及它们的文件名称。

vue-cli版本

2.8.1 
(没有使用ESLint,没有安装单元测试,e2e测试)

相关的配置文件目录

1.├── ...
2.├── build
3.│   ├── build.js
4.│   ├── check-versions.js
5.│   ├── dev-client.js
6.│   ├── dev-server.js
7.│   ├── utils.js
8.│   ├── vue-loader.conf.js
9.│   ├── webpack.base.conf.js
10.│   ├── webpack.dev.conf.js
11.│   └── webpack.prod.conf.js
12.├── config
13.│   ├── dev.env.js
14.│   ├── index.js
15.│   └── prod.env.js
16.├── ...
17.├── package.json
18.└── ...

package.json

1.{
2.    // ...
3.    "scripts": {
4.        // 开发环境
5.        "dev": "node build/dev-server.js",
6.        // 生产环境
7.        "build": "node build/build.js"
8.    },
9.    // ...
10.    "devDependencies": {
11.        // ...
12.        // 配置分离,将配置定义在config/下,然后合并成最终的配置,以避免webpack.config.js臃肿
13.        "webpack-merge": "^2.6.1"
14.    },
15.    // ...
16.}

基础配置

build/webpack.base.conf.js

dev-server.js里引入了webpack.dev.conf.js,build.js里引入了webpack.prod.conf.js,而这两个文件(webpack.dev.conf.js和webpack.prod.conf.js)里都引入了webpack.base.conf.js

1.var path = require('path')
2.var utils = require('./utils')
3.var config = require('../config')
4.var vueLoaderConfig = require('./vue-loader.conf')
5.function resolve (dir) {
6.  return path.join(__dirname, '..', dir)
7.}
8.module.exports = {
9.  // [[ 1. 配置webpack编译入口 ]]
10.  entry: {
11.    app: './src/main.js'
12.  },
13.  // [[ 2. 配置webpack输出路径和命名规则 ]]
14.  output: {
15.    path: config.build.assetsRoot,
16.    filename: '[name].js',
17.    publicPath: process.env.NODE_ENV === 'production'
18.      ? config.build.assetsPublicPath
19.      : config.dev.assetsPublicPath
20.  },
21.  // [[ 3. 配置模块resolve规则 ]]
22.  resolve: {
23.    extensions: ['.js', '.vue', '.json'],
24.    // 创建路径别名
25.    alias: {
26.      'vue$': 'vue/dist/vue.esm.js',
27.      '@': resolve('src')
28.    }
29.  },
30.  // [[ 4. 配置不同类型模块的处理规则 ]]
31.  module: {
32.    rules: [
33.      {
34.        test: /\.vue$/,
35.        loader: 'vue-loader',
36.        options: vueLoaderConfig
37.      },
38.      {
39.        test: /\.js$/,
40.        loader: 'babel-loader',
41.        include: [resolve('src'), resolve('test')]
42.      },
43.      {
44.        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
45.        loader: 'url-loader',
46.        options: {
47.          limit: 10000,
48.          name: utils.assetsPath('img/[name].[hash:7].[ext]')
49.        }
50.      },
51.      {
52.        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
53.        loader: 'url-loader',
54.        options: {
55.          limit: 10000,
56.          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
57.        }
58.      }
59.    ]
60.  }
61.}

开发环境

build/dev-server.js

执行npm run dev首先运行dev-server.js这个文件。

1.// [[ 1. 检查node和npm的版本 ]]
2.require('./check-versions')()
3.// [[ 2. 引入相关插件和配置 ]]
4.// 获取配置,获取配置中设置的环境变量
5.var config = require('../config')
6.if (!process.env.NODE_ENV) {
7.  process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
8.}
9.var opn = require('opn') // 用于打开默认浏览器打开localhost:端口
10.var path = require('path')
11.var express = require('express')
12.var webpack = require('webpack')
13.var proxyMiddleware = require('http-proxy-middleware') // 一个express中间件,用于将http请求代理到其他服务器
14.var webpackConfig = require('./webpack.dev.conf')
15.// 设置监听端口
16.var port = process.env.PORT || config.dev.port
17.// 设置是否自动打开浏览器
18.var autoOpenBrowser = !!config.dev.autoOpenBrowser
19.// 定义HTTP代理表
20.// https://github.com/chimurai/http-proxy-middleware
21.var proxyTable = config.dev.proxyTable
22.// [[ 3. 创建express服务器和webpack编译器 ]]
23.var app = express()
24.var compiler = webpack(webpackConfig)
25.// [[ 4. 配置开发中间件和热重载中间件 ]]
26.var devMiddleware = require('webpack-dev-middleware')(compiler, {
27.  publicPath: webpackConfig.output.publicPath,
28.  quiet: true
29.})
30.var hotMiddleware = require('webpack-hot-middleware')(compiler, {
31.  log: () => {}
32.})
33.// 当html-webpack-plugin模版文件发生改变,强制页面重载
34.compiler.plugin('compilation', function (compilation) {
35.  compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
36.    hotMiddleware.publish({ action: 'reload' })
37.    cb()
38.  })
39.})
40.// [[ 5. 挂载代理服务和中间件 ]]
41.Object.keys(proxyTable).forEach(function (context) {
42.  var options = proxyTable[context]
43.  if (typeof options === 'string') {
44.    options = { target: options }
45.  }
46.  app.use(proxyMiddleware(options.filter || context, options))
47.})
48.// 重定向不存在的URL
49.app.use(require('connect-history-api-fallback')())
50.// 使用开发中间件,即把webpack编译后输出到内存中的文件资源挂到express服务器上
51.app.use(devMiddleware)
52.// 挂载热重载
53.app.use(hotMiddleware)
54.// [[ 6. 配置静态资源 ]]
55.var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
56.app.use(staticPath, express.static('./static'))
57.// [[ 7. 启动服务器监听特定端口]]
58.var uri = 'http://localhost:' + port
59.var _resolve
60.var readyPromise = new Promise(resolve => {
61.  _resolve = resolve
62.})
63.// [[ 8. 打开默认浏览器打开localhost:端口 ]]
64.console.log('> Starting dev server...')
65.devMiddleware.waitUntilValid(() => {
66.  console.log('> Listening at ' + uri + '\n')
67.  // when env is testing, don't need open it
68.  if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
69.    opn(uri)
70.  }
71.  _resolve()
72.})
73.// 监听端口
74.var server = app.listen(port)
75.module.exports = {
76.  ready: readyPromise,
77.  close: () => {
78.    server.close()
79.  }
80.}

其他配置文件

  • build/webpack.dev.conf.js:在webpack.base.conf的基础上完善了开发环境中需要的配置,如合并配置文件、更友好地输出webpack的警告信息等

  • build/utils.js:配置静态资源路径,pei z样式的加载器cssLoaders和styleLoaders

  • build/vue.loader.conf.js:配置了css加载器和编译css之后自动添加前缀(autoprefixer)

生产环境

build/build.js

执行npm run build首先运行build.js这个文件。

1.// [[ 1. 检查NodeJS和npm的版本 ]]
2.require('./check-versions')()
3.process.env.NODE_ENV = 'production'
4.var ora = require('ora') // 用于开启loading动画
5.var rm = require('rimraf')
6.var path = require('path')
7.var chalk = require('chalk')
8.var webpack = require('webpack')
9.var config = require('../config')
10.var webpackConfig = require('./webpack.prod.conf')
11.// [[ 2. 开启loading动画 ]]
12.var spinner = ora('building for production...')
13.spinner.start()
14.// [[ 3. 删除创建打包的目标文件夹]]
15.rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
16.  if (err) throw err
17.  // [[ 4. webpack编译 ]]
18.  webpack(webpackConfig, function (err, stats) {
19.    spinner.stop()
20.    if (err) throw err
21.    // 输出相关信息
22.    process.stdout.write(stats.toString({
23.      colors: true,
24.      modules: false,
25.      children: false,
26.      chunks: false,
27.      chunkModules: false
28.    }) + '\n\n')
29.    console.log(chalk.cyan('  Build complete.\n'))
30.    console.log(chalk.yellow(
31.      '  Tip: built files are meant to be served over an HTTP server.\n' +
32.      '  Opening index.html over file:// won\'t work.\n'
33.    ))
34.  })
35.})

其他配置文件

build/webpack.prod.conf.js:在webpack.base.conf的基础上完善了生产环境中需要的配置,如合并基础的webpack配置、配置webpack的输出、丑化压缩代码、抽离css文件等


转载请注明: Vue教程中文网 - 打造国内领先的vue学习网站-vue视频,vue教程,vue学习,vue培训 » 总结vue-cli中的webpack配置

喜欢 ()or分享