邂逅webpack

100 阅读3分钟
一. 前备知识 - path
1. path

image.png

2. path的API

image.png

const path1 = '/abc/cba'
const path2 = '../wxy/kobe/james.js'

path.join(path1,path2)   // \abc\wxy\kobe\james.js
// /abc.text已经是一个绝对路径了
path.resolve('./abc/cba','./wxy/kobe','/abc.text')   // F:\abc.text 

// 处理完给定的path,还没有生成绝对路径,则和当前目录进行拼接
path.resolve('./abc/cba','../wxy/kobe','./abc.text')   // F:\test_webpack\01_test\abc\wxy\kobe\abc.text

//如果没有传参,则返回当前工作目录的绝对路径
path.resolve()  // F:\test_webpack\01_test
二. webpack
1.webpack安装

image.png

2.webpack基本打包过程

在目录下执行webpack进行打包;默认的入口文件是src/index.js,如果没有就报错;打包后生成dist文件夹,里面存放打包后的文件

(1)创建package.json

npm init

(2)安装局部的webpack

npm install webpack webpack-cli -D

(3)打包命令(webpack默认把src/index.js作为入口文件)

npx webpack  // src/index -> dist/main.js

//可以通过配置来指定入口文件和出口
npx webpack --entry ./src/main.js --output-filename buile.js --output-path ./build

(4)可以通过配置文件webpack.config.js来配置webpack

const path = require("path")

console.log(__dirname)

// 定义了入口文件和打包后的目录名称和文件名称
module.exports = {
  entry: "./src/main.js",
  output:{
    filename: "buile.js",
    path: path.resolve(__dirname,"./build")
  }
}

运行 npx webpack

(5)修改webpack默认的配置文件

npx webpack --config wk.config.js

(6)因为配置命令太长可以在package.json里面的scripts里面配置命令

  "scripts": {
    "build": "webpack --config wk.config.js"
  },
3. loader

(1)使用loader方式

image.png

// 内联
// 可以在 import 语句或任何与 "import" 方法同等的引用方式中指定 loader。使用 ! 将资源中的 loader 分开。
import Styles from 'style-loader!css-loader?modules!./styles.css';
// loader 从右到左(或从下到上)地执行
// 从 sass-loader 开始执行,然后继续执行 css-loader,最后以 style-loader 为结束
module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          { loader: 'style-loader' },
          {
            loader: 'css-loader',
            options: {
              modules: true,
            },
          },
          { loader: 'postcss-loader' },
          { loader: 'sass-loader' },
        ],
      },
    ],
  },
};

(2)css处理

style-loader 把css-loader解析后的css以<style>标签的样式引入
css-loader 解析css文件
less-loader  处理less文件
postcss-loader  帮助我们进行一些css的转化和适配,比如自动添加浏览器前缀,css样式的重置; (插件:autoprefixer,postcss-preset-env)

image.png (3)图片处理

image.png

asset/inline : 将图片进行base64的编码,并将编码后的base64放到打包后的js文件中(缺点:少网络请求,造成js非常大,下载js文件本身消耗的时间长,造成js代码的下载和解析执行时间过长)

asset/resource : 打包两张图片,并且这两张图片有hash地址,将hash地址设在src或者url中(缺点:多发了图片加载的网络请求)

注:对于小一点的图片,可以进行base64打包;对于大一点的图片,单独的图片打包,形成url地址,单独的请求这个url地址

asset: 设置大小来打包图片

image.png

image.png

打包图片重命名

可以在output里面设置: assertModuleFilename: 'abc.png'

也可以

image.png [hash:8]: 取hash值的前8位

(4)babel

将ES6的语法转换成ES5的语法

image.png

或者直接安装 npm install babel-loader -D

image.png

babel也有自己的预设:@babel/preset-env

image.png

(5)处理vue

安装vue-loader,使用VueLoaderPlugin

image.png

image.png

image.png

(6)webpack文件路径解析和配置 image.png

image.png

image.png

4.插件plugin

(1)定义

image.png

(2)CleanWebpackPlugin( 修改配置,重新打包时,清空dist文件夹)

// 安装
npm install clean-webpack-plugin -D

// 配置
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

plugins:[
    new CleanWebpackPlugin()
]

(3)HtmlWebpackPlugin (生成打包后的html文件,有默认模版,也可以自定义模版)

// 安装
npm install html-webpack-plugin -D

// 配置
const { HtmlWebpackPlugin } = require('html-webpack-plugin')

plugins:[
    new HtmlWebpackPlugin({
        title: 'webpack项目'template: './public/index.html'  // 自定义模版
    })
]

(4)DefinePlugin(注入全局变量;默认注入process.env.NODE_ENV)

image.png 里面会被当成js代码执行

(5)Mode配置

image.png

5.开启本地服务器

(1)为什么使用

image.png (2)webpack-dev-server开启本地服务配置

// 安装
npm install webpack-dev-server -D

// 配置命令
"scripts": {
    "serve": "webpack serve --config wk.config.js"
},

(3)热模块更新Hot Module Replacement

image.png 开启HMR:

image.png

image.png (4)host配置

image.png

devserver: {
host: '0.0.0',  // 主机
port: 8888,   // 端口
open: true,  //自动打开本地服务器地址
compress: true   //
}

(5)合并公共配置 webpack-merge

image.png