- 当我们习惯了在 node 中编写代码的方式后,在回到前端编写 HTML、css、js 这些东西会感觉到各种的不便。比如:不能放心的使用模块化规范(浏览器兼容性问题)、即使可以使用模块化规范也会面临模块过多时的加载问题。
- 我们就迫切的希望有一款工具可以对代码进行打包,将多个模块打包成一个文件。这样一来即解决了兼容性问题,又解决了模块过多的问题。减少文件数量,浏览器请求数量也会降低,进而提高渲染速度。
- 构建工具就起到这样一个作用,通过构建工具可以将使用 ESM 规范编写的代码转换为旧的 JS 语法,这样可以使得所有的浏览器都可以支持代码。
Webpack
使用步骤:
-
初始化项目
yarn init -y,yarn也是管理node项目的工具,与npm相对应 -
安装依赖
webpack(构建webpack的核心工具)、webpack-cli(用于在命令行使用webpack)。命令:yarn add -D webpack webpack-cli,—D表示开发依赖。[1] -
在项目中创建
src目录,然后编写代码(index.js) -
执行
yarn webpack来对代码进行打包(打包后观察 dist 目录)因为安装了webpack-cli,所以可以在命令行使用上述代码。
注意事项
-
每次在新终端上,输入命令:
yarn每次在新的终端上运行
yarn命令时,它会根据package.json和yarn.lock文件中的依赖关系,自动安装所需的依赖包,并且可以保证依赖包的版本和安装位置等信息与之前保持一致,从而保证项目的稳定性和可重复性。
配置文件(webpack.config.js)
官方中文文档:入口起点(entry points) | webpack 中文文档 (docschina.org)
在指南章节有更加详细的信息。
const path = require("path")
module.exports = {
mode: "production",
entry: "./src/index.js",
output: {},
module: {
rules: [
{
test: /.css$/i,
use: ["style-loader", "css-loader"]
}
]
}
}
Loader
默认webpack仅能打包js文件,使用Loader可以是webpack打包其他文件,例如:css文件,图片等。
Babel
新语法转为旧语法用于旧浏览器,提高兼容性。
-
在编写 js 代码时,经常需要使用一些 js 中的新特性,而新特性在旧的浏览器中兼容性并不好。此时就导致我们无法使用一些新的特性。
-
但是我们现在希望能够使用新的特性,我们可以采用折中的方案。依然使用新特性编写代码,但是代码编写完成时我们可以通过一些工具将新代码转换为旧代码。
-
babel 就是这样一个工具,可以将新的 js 语法转换为旧的 js,以提高代码的兼容性。
-
我们如果希望在 webpack 支持 babel,则需要向 webpack 中引入 babel 的 loader
-
使用步骤
-
安装
npm install -D babel-loader @babel/core @babel/preset-env -
配置:
module: { rules: [ { test: /.m?js$/, exclude: /(node_modules|bower_components)/, use: { loader: "babel-loader", options: { presets: ["@babel/preset-env"] } } } ] } -
在 package.json 中设置兼容列表
"browserslist": [ "defaults" ]
-
插件(plugin)
-
插件用来为 webpack 来扩展功能
注意:loader是用来扩展处理文件的功能,会对代码进行额外的编译操作。
-
HTML-webpack-plugin-
这个插件可以在打包代码后,自动在打包目录生成 HTML 页面
-
使用步骤:
- 安装依赖
- 配置插件
plugins: [ new HTMLPlugin({ // title: "Hello Webpack", template: "./src/index.HTML" }) ]
-
开发服务器(webpack-dev-server)
-
安装:
yarn add -D webpack-dev-server
-
启动:
yarn webpack serve --open,--open表示自动在浏览器中打开注意这个包的功能是将代码在服务器自动打包因此在自己生成dist的时候要使用:
yarn build来生成dist
开发模式配合source-map
两种模式[2]
devtool:"inline-source-map"配置源码的映射,也就是在开发阶段,使用development,配合上述源码映射,就可以在浏览器的中看到源码并进行调试。
相关注释
-
关于开发依赖和项目依赖
一个 Node.js 项目通常需要安装其他依赖项,这些依赖项可能是项目的运行时依赖项,也可能是开发依赖项。以下是一些常用的依赖项及其作用:
- 运行时依赖项(dependencies):这些是项目在运行时必需的依赖项,例如 web 框架、数据库驱动程序、日志库等。这些依赖项应该被安装在生产环境中,并且应该包括在项目的 package.json 文件中。
- 开发依赖项(devDependencies):这些是只在开发期间需要用到的依赖项,例如测试框架、构建工具、代码检查工具等。这些依赖项应该被安装在开发环境中,并且只需要在开发期间使用。在部署项目到生产环境时,这些依赖项通常不需要被包括在项目中。
为什么有些模块只在当做开发依赖,而不是项目依赖?
这是因为开发依赖项只在开发过程中需要用到,而生产环境中不需要。如果将所有依赖项都安装为项目依赖项,会使得生产环境中的项目变得臃肿,增加启动时间和资源消耗。此外,有些开发依赖项可能只在特定的开发场景下需要使用,例如测试框架,只有在进行单元测试或集成测试时才会使用。因此,将这些模块作为开发依赖项可以帮助我们更好地管理项目依赖项,同时减少项目的体积和运行时的开销。
-
关于开发模式和生产模式
在 Webpack 中,使用不同的模式(mode)打包会有一些区别。
开发模式(development mode)的打包主要特点是:
- 输出的代码不会被压缩,可读性更好,便于调试。
- 模块热替换(Hot Module Replacement)功能会自动开启,可以实现在应用运行时更新代码,而不需要手动刷新页面。
- 会生成 source map 文件,便于调试时定位错误。
在开发模式下打包的代码更适合在开发阶段使用,因为它们在运行时的可读性更高,更容易进行调试和排错。
生产模式(production mode)的打包主要特点是:
- 输出的代码会被压缩,减小文件体积,提高运行性能。
- 模块热替换功能会被禁用。
- 不会生成 source map 文件,以保护源代码的安全性。
在生产模式下打包的代码更适合在发布阶段使用,因为它们经过压缩和优化,可以提高应用程序的性能,并且不会暴露源代码。但是,由于没有 source map 文件,调试时可能会比较困难。
因此,在开发阶段应该使用开发模式打包,而在发布阶段应该使用生产模式打包。当然,可以通过配置 Webpack 的 mode 选项来自动切换打包模式,从而避免手动切换模式的麻烦。
Vite
-
Vite 也是前端的构建工具
-
相较于 webpack,vite 采用了不同的运行方式:
- 开发时,并不对代码打包,而是直接采用 ESM 的方式来运行项目
- 在项目部署时,在对项目进行打包
-
除了速度外,vite 使用起来也更加方便
-
基本使用:
-
安装开发依赖 vite
-
vite 的源码目录就是项目根目录
-
开发命令:
vite启动开发服务器vite build打包代码vite preview预览打包后代码
-
-
使用命令构建
npm create vite@latest yarn create vite pnpm create vite -
配置文件:
vite.config.js -
格式:
import { defineConfig } from "vite" import legacy from "@vitejs/plugin-legacy" export default defineConfig({ plugins: [ legacy({ targets: ["defaults"] }) ] })