webpack (静态模块打包工具) 手记

  • 新建src 在下面创建 index.js (入口文件) 和 add.js

  • 下载安装webpack (npm run build 或 yarn build), 配置打包命令 build : webpackwebpack (静态模块打包工具) 手记

  • 默认入口src/index.js-要被打包的文件, 要引入到这里使用
    webpack (静态模块打包工具) 手记

  • 输入yarn build打包命令(实际是项目环境webpack命令)

  • 输出代码到add/add.js中

修改入口与出口点

webpack (静态模块打包工具) 手记
新建 webpack.config.js (注意路径)

//在里面添加
const path = require('path')

module.exports = {
  entry: './src/main.js', //入口文件
  output: {
    path: path.resolve(__dirname, 'dist'), //出口文件
    filename: 'bundle.js', //出口文件名
  },
}

修改成功
webpack (静态模块打包工具) 手记
webpack (静态模块打包工具) 手记


隔行变色

  • 下载jquery
  • npm add jquery
  • 新建public/index.html - 前端首页
    webpack (静态模块打包工具) 手记
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <div id="myUL">
      <!-- ul>li{我是第$个li}*10 -->
      <ul>
        <li>我是第1个li</li>
        <li>我是第2个li</li>
        <li>我是第3个li</li>
        <li>我是第4个li</li>
        <li>我是第5个li</li>
        <li>我是第6个li</li>
        <li>我是第7个li</li>
        <li>我是第8个li</li>
        <li>我是第9个li</li>
      </ul>
    </div>
  </body>
</html>

  • 新建src/main.js - webpack打包入口
    webpack (静态模块打包工具) 手记

  • index.html 准备一些li

  • 在src/main.js引入jqueryimport $ from 'jquery'

  • main.js中编写, 隔行变色代码

$('#myUL li:even').css('color','red') //奇数筛选
$('#myUL li:odd').css('color','green') //偶数筛选
  • 执行打包命令
  • 把public/index.html手动复制到dist下
  • 手动引入打包后bundle.js
    webpack (静态模块打包工具) 手记

webpack-插件-自动生成html文件

下载 npm add html-webpack-plugin@5.3.1 -D
webpack.config.js配置

const path = require('path')
// 引入自动生成 html 的插件
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: './src/main.js', //入口文件
  output: {
    path: path.resolve(__dirname, 'dist'), //出口文件
    filename: 'bundle.js', //出口文件名
  },
  plugins: [
    new HtmlWebpackPlugin({
      // 以此为基准生成打包后html文件
      template: './public/index.html' //把对应路径的html进行打包
    })
  ]
}

重新打包后观察dist下

  • 自动生成了html文件
  • 自动引入打包后js文件
    webpack (静态模块打包工具) 手记

自动生成html和引入打包后文件, 应该怎么做?

  • 下载 npm add html-webpack-plugin@5.3.1 -D 插件包, 给webpack.config.js配置上

说白了就是指定哪个html文件,给它生成到哪里去


webpack-加载器-处理css文件问题

webpack (静态模块打包工具) 手记
webpack只识别js文件,默认无法打包css文件


webpack-加载器-处理css文件

  • css-loader 会对 @import 和 url() 进行处理,就像 js 解析 import/require() 一样。
  • style-loader 把 CSS 插入到 DOM 中
  • 一起安装使用 npm add css-loader@5.2.1 style-loader@2.0.0 -D

在main.js中进行引入(入口文件)

import './css/index.css' //导入css代码

webpack.config.js 配置

module.exports = {
    // ...其他代码
    module: { // 如何处理项目中不同模块文件
        rules: [ // 规则
          {
            test: /\.css$/i, // 匹配所有的css文件
            // use数组里从右向左运行
            // 先用 css-loader 让webpack能够识别 css 文件的内容并打包
            // 再用 style-loader 将样式, 把css插入到dom中
            use: [ "style-loader", "css-loader"]
          }
        ]
    }
}

运行打包命令

  • css代码被打包进了dist/bundle.js中
  • 运行时, css代码插入到html的style标签中,样式可以正常生效

webpack-加载器-处理less文件

less-loader
webpack 将 Less 编译为 CSS 的 loader
首先,你需要先安装 less 和 less-loader

npm add less@4.1.1 less-loader@8.1.0 -D

webpack.config.js 配置

 module: { // 如何处理项目中不同模块文件
    rules: [ // 规则
      {
        test: /\.css$/i, // 匹配所有的css文件
        // use数组里从右向左运行
        // 先用 css-loader 让webpack能够识别 css 文件的内容并打包
        // 再用 style-loader 将样式, 把css插入到dom中
        use: ["style-loader", "css-loader"]
      },
      {
        test: /\.less$/i, // 匹配.less结尾文件
        // 使用less-loader, 让webpack处理less文件, 内置还会用less模块, 翻译less代码成css代码
        use: ["style-loader", "css-loader", 'less-loader'] //顺序不能乱
        // less-loader 把less文件转css文件和代码
        // css-loader 把css代码打包进js中
        // style-loader 把css代码 -> 插入 -> DOM中
      }
    ]
  }
}

main.js(入口文件引入)

import './less/index.less' //导入less代码

一共用了四个包 处理css的包+处理less的包


webpack5-加载器-处理图片文件

资源模块

资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader
webpack (静态模块打包工具) 手记

  • webpack.config.js填写
module: {
    rules: [ 
        // ...省略其他
        {
            test: /\.(png|jpg|gif|jpeg)$/i, // 匹配图片文件
            type: 'asset' // 在导出一个 data URI 和一个单独的文件之间自动选择
            // 小于8kb的, 转成data URI(图片转成base64字符串打包进js中)
            // 大于8kb的, 直接复制文件到dist目录下(因为转base64会体积增30%)
        }
    ]
}

在src/main.js - 把大图插入到创建的img标签上, 添加body上显示

// 引入图片-使用
import imgUrl from './assets/1.gif'
const theImg = document.createElement("img")
theImg.src = imgUrl
document.body.appendChild(theImg)

在css/less/index.less - 把小图片用做背景图

body {
  background: url(../assets/images/logo_small.png) no-repeat center;
}

  • webpack如何支持图片打包
    webpack5内置了, 只需要配置type:‘asset’
  • 对图片有哪两种处理方案
    默认8kb以下图片, 转成base64字符串打包进js中, 减少网络请求次数
    超过8kb的图片, 直接复制到dist下, 转base64会增加30%体积

webpack-加载器-处理字体文件

webpack.config.js

 {
        test: /\.(eot|svg|ttf|woff|woff2)$/, //匹配以eot svg ttf woff woff2为结尾的文件
        type: 'asset/resource',  // 当做静态资源直接复制文件
        generator: {
          filename: 'font/[name].[hash:6][ext]' // 放到dist/font文件夹, 文件名格式如左
          // [name] 占位符,使用源文件的名字
          // [hash] 设置是会添加6位哈希值,防止重名
          // [ext] 代表源文件的扩展名
        }
      }

main.js(入口文件)

// 目标,打包和使用字体图标
import './assets/fonts/iconfont.css'
let thtI = document.createElement('i')
thtI.className = 'iconfont icon-qq'
document.body.appendChild(thtI)

在html设置字体图标

打包,得到结果


webpack-加载器-处理高版本js语法

让webpack, 对高版本js语法降级

babel-loader
此 package 允许你使用 Babel 和 webpack 转译 JavaScript 文件

babel编译器=> 用于处理高版本 js语法 的兼容性
webpack配合babel-loader 对js语法做处理

  • src/main.js - 编写箭头函数
const fn = () => { // 高级语法
  console.log("你好babel");
}
console.log(fn) // 一定打印函数, 才会被webpack把"函数体"打包起来

安装对应包

npm add -D babel-loader@8.2.2 @babel/core@7.13.15 @babel/preset-env@7.13.15

webpack (静态模块打包工具) 手记
webpack.config.js 配置

  {
            test: /\.js$/, // 匹配js结尾文件
            exclude: /(node_modules|bower_components)/, // 不转换这2个文件夹里的js
            use: { 
                loader: 'babel-loader', // 使用加载器-处理
                options: {
                    presets: ['@babel/preset-env'] // 预设:转码规则(用bable开发环境本来预设的)
                }
            }
        }

打包后观察dist/的js文件, 自动变成普通函数
webpack (静态模块打包工具) 手记


webpack-开发服务器

webpack (静态模块打包工具) 手记

  1. 构建入口和所有模块依赖关系图
  2. 磁盘读取对应的文件到内存, 才能加载
  3. 用对应的 loader 进行处理和翻译
  4. 将处理完的内容, 输出到内存里而非磁盘上
  5. 以后代码变化, 自动更新打包变化的代码, 显示到浏览器上

下载包

npm add webpack-dev-server@3.11.2 -D

webpack.config.js 配置
webpack (静态模块打包工具) 手记

mode:'development', //开发环境,不加默认生产环境

package.json配置

scripts: {
	"build": "webpack",
	"serve": "webpack serve"
}

运行命令-启动webpack开发服务器
npm run serve

启动一个web服务器和端口, 在浏览器访问查看

效果: 以后改src下的代码, 自动打包更新到浏览器上


webpack-开发服务器-配置

webpack.config.js中添加服务器配置

module.exports = {
    // ...其他配置
    devServer: {
      port: 3000, // 端口号
      open: true // 启动后自动打开浏览器
    }
}

运行
npm run serve
端口号改变,html自动弹出


webpack官网地址:
https://webpack.docschina.org/

上一篇:linux-less 命令?


下一篇:微信小程序开发使用less预处理器(vscode)