二四(Node3)、Webpack打包、开发服务器dev、开发模式 生产模式、解析别名路径

1. Webpack 简介与体验

javascript 复制代码
/* 
  使用 Webpack

  需求:封装 utils 包,校验用户名和密码长度,在 index.js 中使用,使用 Webpack 打包
  步骤:
  1. 新建项目文件夹,初始化包环境,得到 package.json 文件
      npm init -y
  2. 新建 src 源代码文件夹(书写代码)
  3. 下载 webpack webpack-cli 到项目(版本独立)
      npm i webpack webpack-cli --save-dev
  4. 项目中运行工具命令,采用自定义命令的方式(局部命令)
      npm run build
  5. 自动产生 dist 分发文件夹(压缩和优化后,用于最终运行的代码)


  1. Webpack 有什么用?
    ➢ 压缩,转译,整合,打包我们的静态模块
  2. Webpack 怎么用?
    ➢ 初始化环境,编写代码
    ➢ 安装,配置自定义命令
    ➢ 打包体验
  3. 如何运行 package.json 里的自定义命令?
    ➢ npm run 自定义命令
  4. Webpack 默认入口和出口?
    ➢ src/index.js 和 dist/main.js
*/

2. 自动生成 html 文件

插件 html-webpack-plugin

javascript 复制代码
// 1. 插件 html-webpack-plugin 作用:在 Webpack 打包时生成 html 文件,并引入其他打包后的资源
// 2. 步骤:
//   2.1 下载 html-webpack-plugin 本地软件包到项目中
//       npm i html-webpack-plugin --save-dev
//   2.2 配置 webpack.config.js 让 Webpack 拥有插件功能
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  // 插件列表
  plugins: [
    new HtmlWebpackPlugin({
      // 以指定的 html 文件作为生成模板
      template: path.resolve(__dirname, "public/index.html"),
    }),
  ],
};
//   2.3 指定以 public/index.html 为模板复制到 dist/index.html,并自动引入其他打包后资源
// 3. 运行打包命令,观察打包后 dist 文件夹下内容并运行查看效果

3. 打包 css 代码

javascript 复制代码
/* 
  Webpack 默认只识别 JS 和 JSON 文件内容,
  所以想要让 Webpack 识别更多不同内容,需要使用加载器

  css-loader style-loader 这2个加载器来辅助 Webpack 才能打包 css 代码

  加载器的作用:让 Webpack 识别更多的代码内容类型
*/

// 1. 准备 css 文件引入到 src/mian.js 中(压缩转译处理等)
import "./css/index.css";
// 2. 下载 css-loader 和 style-loader 本地软件包
// npm i css-loader style-loader --save-dev
// 3. 配置 webpack.config.js 让 Webpack 拥有该加载器功能
module.exports = {
  // 加载器
  module: {
    // 规则列表
    rules: [
      {
        // 匹配 .css 结尾的文件
        test: /\.css$/i,
        // 使用从后到前的加载器来解析 css 代码和插入到 DOM
        use: ["style-loader", "css-loader"],
      },
    ],
  },
};
// 4. 打包后运行 dist/index.html 观察效果,看看准备好的样式是否作用在网页上

4. 打包 less 代码

javascript 复制代码
// ! 打包 less
// 1. 准备 less 样式引入到 src/main.js 中
import "@/less/index.less";

// 2. 下载 less 和 less-loader 本地软件包
// npm i less less-loader --save-dev

// 3. 配置 webpack.config.js 让 Webpack 拥有功能
module.exports = {
  // 加载器
  module: {
    // 规则列表
    rules: [
      {
        test: /\.less$/i,
        use: [
          // compiles Less to CSS
          "style-loader",
          "css-loader",
          "less-loader",
        ],
      },
    ],
  },
};

// 4. 打包后运行 dist/index.html 观察效果

5. 打包图片

javascript 复制代码
// ! 打包图片
// 资源模块: 图片,字体文件等
/* 
  - 小于 8KB 文件会被转成 data URI(base64 字符串)打包进 JS 文件中(好处:可以减少网络请求次数,缺点:增加 30% 体积)
  - 大于 8KB 文件会被复制到 dist 下,自动替换使用代码的图片名字
*/

// 1. 准备图片素材到 src/assets 中(存放资源模块 - 图片/字体图标等)

// 2. 在 index.less 中给 body 添加背景图
/* body{
  background: url(../assets/background.png);
} */

// 3. 在 main.js 中给 img 标签添加 logo 图片
/**
 * 目标:要给 img 标签设置一个 logo 图片
 * 注意:在赋予给 img 的 src 属性图片的时候,需要把图片数据对象引入过来
 */
import imgObj from "@/assets/logo.png";
document.querySelector(".logo-img").src = imgObj;

// 4. 配置 webpack.config.js 让 Webpack 拥有打包图片功能
module.exports = {
  // 加载器
  module: {
    // 规则列表
    rules: [
      {
        // 针对资源模块(图片,字体文件,图标文件等)处理
        test: /\.(png|jpg|jpeg|gif)$/i,
        // 根据文件大小(8KB)小于:把文件转成 base64 打包进 js 文件中(减少网络请求次数)大于:文件复制到输出的目录下
        type: "asset",
        // 输出文件时,路径+名字
        generator: {
          filename: "assets/[hash][ext]",
        },
      },
    ],
  },
};
// 5. 打包后运行 dist/index.html 观察效果

6. 集成 babel 编译器

javascript 复制代码
// ! Webpack 集成 babel 编译器
// babel 编译器的作用: 把 ECMAScript2015+ 语法向后转换,兼容低版本浏览器

// 1. 编写一段映射数组元素,每个数值 + 1 的代码(要求用箭头函数)
// 目标:让 Webpack + Babel 编译降级 JS 语法
const arr = [1, 2, 3];
const result = arr.map((val) => val + 1);
console.log(result);

// 2. 下载 babel babel-loader core 本地软件包
// npm i babel-loader @babel/core @babel/preset-env -D

// 3. 配置 webpack.config.js 让 Webpack 拥有功能
module.exports = {
  module: {
    rules: [
      {
        test: /\.m?js$/,
        // 排除指定目录里的 js (不进行编译降级)
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: "babel-loader",
          options: {
            // 预设规则
            presets: ["@babel/preset-env"],
          },
        },
      },
    ],
  },
};

// 4. 打包运行 dist/index.html 观察效果

7. Webpack 开发服务器

javascript 复制代码
// ! Webpack 开发服务器 webpack-dev-server
// 启动 Web 服务,打包输出源码在内存,并会自动检测代码变化热更新到网页

// 1. 下载 webpack-dev-server 软件包到当前项目
// npm i webpack-dev-server --save-dev

// 2. 配置自定义命令,并设置打包的模式为开发模式
/* "scripts": {
    "dev": "webpack server --mode=development"
  }, */

// 3. 使用 npm run dev 来启动开发服务器,访问提示的域名+端口号,
// 在浏览器访问打包后的项目网页,修改代码后试试热更新效果
// 在 js / css 文件中修改代码保存后,会实时反馈到浏览器

8. Webpack 打包模式

javascript 复制代码
// ! Webpack 打包模式
// 开发模式	development	调试代码,实时加载,模块热替换等
// 生产模式	production	压缩代码,资源优化,更轻量等
/* 
  开发模式注重代码热替换更快,让开发调试代码更便捷,
  生产模式注重项目体积更小,更轻量,适配不同的浏览器环境
*/

9. 调试代码 source map

javascript 复制代码
// ! Webpack 开发环境调错 source map
// source map: 准确追踪 error 和 warning 在原始代码的位置
// webpack.config.js 配置 devtool 选项
module.exports = {
  // inline-source-map -- 把源码的位置信息一起打包在 JS 文件内
  devtool: "inline-source-map",
};

// source map 适用于开发环境,不要在生产环境使用(防止被轻易查看源码位置)

10. 解析别名路径

javascript 复制代码
// ! Webpack 设置解析别名路径
// 创建 import 或 require 的别名,来确保模块引入变得更简单
// 1. 原来路径如下:
import { checkUsername, checkPassword } from "../src/utils/check.js";

// 2. 配置解析别名:在 webpack.config.js 中设置
module.exports = {
  resolve: {
    alias: {
      MyUtils: path.resolve(__dirname, "src/utils"),
      "@": path.resolve(__dirname, "src"),
    },
  },
};

// 3. 引入目标模块写的路径变简单了
import { checkUsername, checkPassword } from "MyUtils/check.js";
import { checkUsername, checkPassword } from "@/utils/check.js";
相关推荐
新知图书2 小时前
Node.js第三方模块
node.js
街尾杂货店&3 小时前
webpack说明
前端·webpack·node.js
老大白菜6 小时前
在 Node.js 中安装和使用 TensorFlow.js 的完整指南
javascript·node.js·tensorflow
爱宇阳8 小时前
如何更新项目中的 npm 或 Yarn 依赖包至最新版本
前端·npm·node.js
HappyAcmen8 小时前
Node.js教程入门第一课:环境安装
前端·vue.js·node.js
zybishe8 小时前
计算机毕业设计原创定制(免费送源码):Node.JS+Express+MySQL Express 流浪动物救助系统
android·深度学习·机器学习·小程序·node.js·课程设计·express
算是难了10 小时前
Vite 与 Webpack 的区别
前端·webpack·node.js
2401_895366001 天前
Node.js 文件系统
node.js
大饼酥1 天前
使用Nexus3搭建npm私有仓库
前端·npm·node.js