Vue二手书商城:(三)项目中的webpack配置

webpack官方文档LOADERS: https://webpack.js.org/loaders/ 
webpack插件:https://webpack.js.org/plugins/
babel官方文档:https://babeljs.io/docs/en/
babel到底该如何配置:https://segmentfault.com/a/1190000011665642

一.package.json

babel

  • 转换规则:@babel/core、babel-loader

  • 语法:@babel/preset-env

css/less

  • css-loader解析@import和url(),依赖于style-loader

  • less-loader依赖于less、css-loader、style-loader

url

  • url-loader以文件内容的 MD5 哈希值生成新文件名,并保留所引用资源的原始扩展名,但是在文件大小(单位 byte)低于指定的限制时,可以返回一个 DataURL,依赖于file-loader

vue

  • vue-loader解析vue文件,依赖于vue-template-compiler(跳转官方文档)

  • vue、vue-router路由、vuex全局组件共享数据、axios发请求 <!--more-->

生产环境的webpack配置需要的包

  • html-webpack-plugin根据你自己的html模板打包出一个html文件,它会使用link/script标签引入你用webpack打包后的相关css/js文件。还可以压缩html文件

  • mini-css-extract-plugin将css从js中抽取出来,如果不用它,打包之后css会和js混在一起

  • optimize-css-assets-webpack-plugin压缩css

  • terser-webpack-plugin压缩js

webpack

  • webpack4依赖于webpack-cli

  • webpack-dev-server实时打包

UI

PS:对css/js的抽取压缩还有其他的插件,部分在webpack4已被弃用,具体可自行查找官方文档。

二.webpack.config.js

 1 //webpack是基于Node构建的,webpack的配置文件支持Node代码
 2 const path = require('path');
 3 //根据模板生成一个HTML5文件
 4 const htmlWebpackPlugin = require('html-webpack-plugin');
 5 const VueLoaderPlugin = require( 'vue-loader/lib/plugin')
 6  7 module.exports = {
 8   entry: path.join(__dirname, './src/main.js'), //入口文件
 9   output: {//输出配置
10     path: path.join(__dirname, './dist'), //输出路径
11     filename: 'js/bundle.js' //输出文件名称
12   },
13   module: {//配置第三方loader模块
14     rules: [//第三方模块匹配规则
15       {//处理CSS文件
16         test: /.css$/,
17         use: ['style-loader', 'css-loader']
18       },
19       {//处理less文件
20         test: /.less$/,
21         use: ['style-loader', 'css-loader', 'less-loader']
22       },
23       {//处理图片路径,引用图片大小小于limit值(byte),则会被转为base64格式的字符串
24         test: /.(jpg|png|gif|bmp|jpeg)$/,
25         use: 'url-loader?limit=5300&name=img/[name].[ext]'
26       },
27       {//处理字体文件 
28         test: /.(ttf|eot|svg|woff|woff2)$/,
29         use: 'url-loader?limit=30000&name=resource/[name].[ext]'
30       },
31       {//配置Babel转换高级的ES语法,不转换node_modules文件夹下的
32         test: /.js$/,
33         use: 'babel-loader',
34         exclude: /node_modules/
35       },
36       {//处理vue文件
37         test: /.vue$/,
38         use: 'vue-loader'
39       }
40     ]
41   },
42   plugins: [//插件配置
43     new htmlWebpackPlugin({
44       template: path.join(__dirname, './src/index.html'),//指定模板文件路径
45       filename: 'index.html' //设置生成页面的名称
46     }),
47     new VueLoaderPlugin()
48   ],
49   mode: 'development',//webpack4.x要加上mode,为development/production/none
50   devServer: { port: 9000 }//在localhost:9000打开
51 };

三.webpack.prod.js

 1 const path = require('path')
 2 const webpack = require('webpack')
 3 const htmlWebpackPlugin = require('html-webpack-plugin')
 4 const VueLoaderPlugin = require( 'vue-loader/lib/plugin')
 5 const TerserPlugin = require('terser-webpack-plugin')
 6 const MiniCssExtractPlugin = require('mini-css-extract-plugin')
 7 const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
 8  9 module.exports = {
10   entry: './src/main.js',
11   output: {
12     filename: 'js/[name].js',
13     path: path.join(__dirname, 'dist')
14   },
15   module: {
16     rules: [
17       {
18         test: /.(le|c)ss$/,
19         use: [
20           {
21             loader: MiniCssExtractPlugin.loader,
22             options: {//样式文件中url()使用相对地址,打包时在图片地址前加../
23               publicPath: '../'
24             }
25           },
26           'css-loader',
27           'less-loader'
28         ]
29       },
30       {
31         test: /.(png|gif|bmp|jpg|jpeg)$/,
32         use: 'url-loader?limit=5300&name=img/[name].[ext]'
33       },
34       {
35         test: /.(ttf|eot|svg|woff|woff2)$/,
36         use: 'url-loader?limit=30000&name=resource/[name].[ext]'
37       },
38       {
39         test: /.js$/,
40         use: 'babel-loader',
41         exclude: /(node_modules)/
42       },
43       {
44         test: /.vue$/,
45         use: 'vue-loader'
46       }
47     ]
48   },
49   plugins: [
50     new htmlWebpackPlugin({
51       template: './src/index.html',
52       filename: 'index.html',
53       favicon: './favicon.ico',
54       minify: {//压缩html
55         collapseWhitespace: true,
56         removeComments: true,
57         removeAttributeQuotes: true
58       }
59     }),
60     new MiniCssExtractPlugin({//从JS中提取CSS
61       filename: 'css/styles.css'
62     }),
63     new VueLoaderPlugin(),
64   ],
65   optimization: {//压缩JS,压缩CSS
66     minimizer: [new TerserPlugin(), new OptimizeCSSAssetsPlugin()],
67     splitChunks: {//webpack自带插件,可以将公共模块提取出来
68       chunks: 'all',
69       cacheGroups: {
70         vendors: {
71           name: 'vendors',//提取成vendors.js文件
72           test: /(vue|vue-router|vuex|axios|mint-ui)/,
73           priority: -10
74         }
75       }
76     }
77   },
78   mode: 'production'
79 }

四..babelrc

preset:配置转译语法 plugin:配置插件

 

配置内容也可以写在webpack配置文件里。

 

自行选择是否使用babel-runtime等其他babel插件:https://webpack.js.org/loaders/babel-loader/

 

五.打包后的文件夹

 

原文地址:https://www.cnblogs.com/M-M-Monica/p/10526115.html