webpack构建流程
从启动webpack构建到输出结果经历了一系列过程,它们是:
解析webpack配置参数,合并从shell传入和
webpack.config.js
文件里配置的参数,生产最后的配置结果。注册所有配置的插件,好让插件监听webpack构建生命周期的事件节点,以做出对应的反应。
从配置的
entry
入口文件开始解析文件构建AST语法树,找出每个文件所依赖的文件,递归下去。在解析文件递归的过程中根据文件类型和loader配置找出合适的loader用来对文件进行转换。
递归完后得到每个文件的最终结果,根据
entry
配置生成代码块chunk
。输出所有
chunk
到文件系统。
Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。 Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为参数,返回 转换的结果。这样,我们就可以通过 require 来加载任何类型的模块或文件,比如 CoffeeScript、 JSX、 LESS 或图片。通过loader最终转换成js。
webpack打包时,会在项目目录创建dist/static,在该目录存放所有的静态资源,同时还会在src/static目录下分别创建目录 img,css,js等目录存放不同类型的静态资源。
对于vue项目里的assets目录下的文件,会分类放入不同的文件夹下。
对于vue项目里的static目录下的文件,原封不动的复制到打包后dist/stiatc下。
webpack.base.config.js配置文件
var path = require('path') var fs = require('fs') var utils = require('./utils') var config = require('../config') var vueLoaderConfig = require('./vue-loader.conf') // 获取绝对路径 function resolve (dir) { return path.join(__dirname, '..', dir) } module.exports = { // webpack入口文件 entry: { app: './src/main.js' }, // webpack输出路径和命名规则 output: { // webpack输出的目标文件夹路径(例如:/dist) path: config.build.assetsRoot, // webpack输出bundle文件命名格式 filename: '[name].js', // webpack编译输出的发布路径(例如'//cdn.xxx.com/app/') publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath }, // 模块resolve的规则 resolve: { extensions: ['.js', '.vue', '.json'], // 别名,方便引用模块,例如有了别名之后, // import Vue from 'vue/dist/vue.common.js'可以写成 import Vue from 'vue' alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), }, symlinks: false }, // 不同类型模块的处理规则 module: { rules: [ {// 对src和test文件夹下的.js和.vue文件使用eslint-loader进行代码规范检查 test: /\.(js|vue)$/, loader: 'eslint-loader', enforce: 'pre', include: [resolve('src'), resolve('test')], options: { formatter: require('eslint-friendly-formatter') } }, {// 对所有.vue文件使用vue-loader进行编译 test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, {// 对src和test文件夹下的.js文件使用babel-loader将es6+的代码转成es5 test: /\.js$/, loader: 'babel-loader', include: [resolve('src'), resolve('test')] }, {// 对图片资源文件使用url-loader test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { // 小于10K的图片转成base64编码的dataURL字符串写到代码中 limit: 10000, // 其他的图片转移到静态资源文件夹 name: utils.assetsPath('img/[name].[hash:7].[ext]') } }, {// 对多媒体资源文件使用url-loader test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { // 小于10K的资源转成base64编码的dataURL字符串写到代码中 limit: 10000, // 其他的资源转移到静态资源文件夹 name: utils.assetsPath('media/[name].[hash:7].[ext]') } }, {// 对字体资源文件使用url-loader test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { // 小于10K的资源转成base64编码的dataURL字符串写到代码中 limit: 10000, // 其他的资源转移到静态资源文件夹 name: utils.assetsPath('fonts/[name].[hash:7].[ext]') } } ] } }