webpack前端工程化

文中图片无法显示查看源码中的PDF或者有道云笔记

源码:vue-webpack-test: webpack前端工程化

有道云笔记:有道云笔记

注:黑马程序员vue2-vue3视频教程笔记

一. 前端工程化

⚫ 模块化(js 的模块化、css 的模块化、资源的模块化)

⚫ 组件化(复用现有的 UI 结构、样式、行为)

⚫ 规范化(目录结构的划分、编码规范化、接口规范化、文档规范化、 Git 分支管理)

⚫ 自动化(自动化构建、自动部署、自动化测试)

1. 什么是前端工程化

前端工程化指的是:在企业级的前端项目开发中,把前端开发所需的工具技术流程经验等进行规范化、

标准化。

企业中的 Vue 项目和 React 项目,都是基于工程化的方式进行开发的。

好处:前端开发自成体系,有一套标准的开发方案和流程

2. 前端工程化的解决方案

早期的前端工程化解决方案:

gruntGrunt: JavaScript 世界的构建工具 | Grunt 中文网 )

gulpgulp.js - 基于流(stream)的自动化构建工具 | gulp.js 中文网 )

目前主流的前端工程化解决方案:

webpackwebpack 中文文档 | webpack 中文网 )

parcelParcel 中文网 )

二. webpack

1. 什么是 webpack

概念:webpack 是前端项目工程化的具体解决方案

主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆处理浏览器端 JavaScript 的兼容性

能优化等强大的功能。

好处:让程序员把工作的重心放到具体功能的实现上,提高了前端开发效率和项目的可维护性

注意:目前 Vue,React 等前端项目,基本上都是基于 webpack 进行工程化开发的。

2. 创建列表隔行变色项目

① 新建项目空白目录,并运行 npm init –y 命令,初始化包管理配置文件 package.json

② 新建 src 源代码目录

③ 新建 src -> index.html 首页和 src -> index.js 脚本文件

④ 初始化首页基本的结构

⑤ 运行 npm install jquery –S 命令,安装 jQuery

⑥ 通过 ES6 模块化的方式导入 jQuery,实现列表隔行变色效果

遇到的问题

快捷创建便签的方式:

输入:ul>li{这是第$个li}*9

按:Tab键

代码

index.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Document</title>

</head>

<body>

    <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>

</body>

<script src="index.js"></script>

</html>

index.js

//1.使用ES6语法导入jQuery

import $ from 'jquery'

//2.定义jquery的入口函数

$(function (){

    //3.实现奇偶行变色

    //奇数行为红色

    $('li:odd').css('background-color','red')

    //偶数行为粉色

    $('li:even').css('background-color','pink')

})

error:语法太高级出错:

3. 在项目中安装 webpack

在终端运行如下的命令,安装 webpack 相关的两个包:(-D即--dev开发环境)

npm install webpack@5.42.1 webpack-cli@4.9.0 -D

npm install webpack webpack-cli -D

package.json(部分)

"dependencies": {

  "jquery": "^3.6.0"

},

"devDependencies": {

  "webpack": "^5.42.1",

  "webpack-cli": "^4.7.2"

}

dependencies:开发和上线都会用到的依赖

devDependencies:仅开发环境中用到的依赖

安装后需要配置。

4. 在项目中配置 webpack

① 在项目根目录中,创建名为 webpack.config.js 的 webpack 配置文件,并初始化如下的基本配置:

//使用Node.js中的语法,向外导出一个webpack的配置对象

module.exports = {

    mode: 'development' //mode用于指定构建模式(运行模式),可选值有development和production

}

② 在 package.json 的 scripts 节点下,新增 dev 脚本如下:

"scripts": {

  "dev":"webpack"

},

③ 在终端中运行 npm run dev 命令,启动 webpack 进行项目的打包构建

多了一个dist文件夹

代码

index.html

<!--不应该导入这个-->

<!--<script src="index.js"></script>-->

<!--导入打包后的-->

<script src="../dist/main.js"></script>

运行结果

4.1 mode 的可选值

mode 节点的可选值有两个,分别是:

① development

开发环境

不会对打包生成的文件进行代码压缩性能优化

⚫ 打包速度快,适合在开发阶段使用

② production

生产环境

对打包生成的文件进行代码压缩性能优化

⚫ 打包速度很慢,仅适合在项目发布阶段使用

4.2 webpack.config.js 文件的作用

webpack.config.js 是 webpack 的配置文件。webpack 在真正开始打包构建之前,会先读取这个配置文件

从而基于给定的配置,对项目进行打包。

注意:由于 webpack 是基于 node.js 开发出来的打包工具,因此在它的配置文件中,支持使用 node.js 相关的语法和模块进行 webpack 的个性化配置。

4.3 webpack 中的默认约定

在 webpack 4.x 和 5.x 的版本中,有如下的默认约定:

① 默认的打包入口文件为 src -> index.js

② 默认的输出文件路径为 dist -> main.js

注意:可以在 webpack.config.js 中修改打包的默认约定

4.4 自定义打包的入口与出口

在 webpack.config.js 配置文件中,通过 entry 节点指定打包的入口。通过 output 节点指定打包的出口

示例代码如下:

const path=require('path')

//使用Node.js中的语法,向外导出一个webpack的配置对象

module.exports = {

    //mode用于指定构建模式(运行模式),可选值有development和production

    mode: 'development',

    //entry:'指定要处理哪个文件'

    entry: path.join(__dirname, './src/index1.js'),

    //指定生成文件要存放的位置,默认是dist

    output: {

        //输出文件存放的路径

        path: path.join(__dirname,'./dist'),

        //生成的文件名

        filename: 'bundle.js'

    }

}

5. webpack 中的插件

1. webpack 插件的作用

通过安装和配置第三方的插件,可以拓展 webpack 的能力,从而让 webpack 用起来更方便。最常用的

webpack 插件有如下两个:

webpack-dev-server

⚫ 类似于 node.js 阶段用到的 nodemon 工具

⚫ 每当修改了源代码,webpack 会自动进行项目的打包和构建

html-webpack-plugin

⚫ webpack 中的 HTML 插件(类似于一个模板引擎插件)

⚫ 可以通过此插件自定制 index.html 页面的内容

2. webpack-dev-server

webpack-dev-server 可以让 webpack 监听项目源代码的变化,从而进行自动打包构建

2.1 安装 webpack-dev-server

运行如下的命令,即可在项目中安装此插件:

npm install webpack-dev-server -D

2.2 配置 webpack-dev-server

① 修改 package.json -> scripts 中的 dev 命令如下:

② 再次运行 npm run dev 命令,重新进行项目的打包

③ 在浏览器中访问 http://localhost:8080 地址,查看自动打包效果

2.3 打包生成的文件哪儿去了?

① 不配置 webpack-dev-server 的情况下,webpack 打包生成的文件,会存放到实际的物理磁盘上

⚫ 严格遵守开发者在 webpack.config.js 中指定配置

⚫ 根据 output 节点指定路径进行存放

② 配置了 webpack-dev-server 之后,打包生成的文件存放到了内存

⚫ 不再根据 output 节点指定的路径,存放到实际的物理磁盘上

⚫ 提高了实时打包输出的性能,因为内存比物理磁盘速度快很多

放在内存中的原因:放在内存中加载会比较快,从磁盘中读取会比较慢

webpack-dev-server工作原理

一个小问题:webpack output is served from /

webpack-dev-server打包后,修改文件后会如下:

但修改后页面的样式没有变,原因是修改后的文件放在内存的根目录下,而不是物理磁盘

2.4 生成到内存中的文件该如何访问?

webpack-dev-server 生成到内存中的文件,默认放到了项目的根目录中,而且是虚拟的不可见的

⚫ 可以直接用 / 表示项目根目录后面跟上要访问的文件名称,即可访问内存中的文件

⚫ 例如 /bundle.js 就表示要访问 webpack-dev-server 生成到内存中的 bundle.js 文件

页面引用js方式

因此index.html应该加载内存中的js

<!--<script src="../dist/bundle.js"></script>-->

<script src="/bundle.js"></script>

打开页面方式

通过http://localhost:8080/src/访问

3. html-webpack-plugin

html-webpack-plugin 是 webpack 中的 HTML 插件,可以通过此插件自定制 index.html 页面的内容

需求:通过 html-webpack-plugin 插件,将 src 目录下的 index.html 首页,复制到项目根目录中一份

3.1 安装 html-webpack-plugin

运行如下的命令,即可在项目中安装此插件:

npm install html-webpack-plugin -D

3.2 配置 html-webpack-plugin

在webpack.config.js中添加

const path=require('path');

//1.导入html-webpack-plugin这个插件,得到插件的构造函数

const HTMLPlugin = require('html-webpack-plugin');

//2.new构造函数,创建插件的实例对象

const htmlPlugin = new HTMLPlugin({

    //指定复制哪个页面

    template: './src/index.html',

    //指定复制出来的文件名和存放路径

    filename: './index.html'

})

//使用Node.js中的语法,向外导出一个webpack的配置对象

module.exports = {

    //mode用于指定构建模式(运行模式),可选值有development和production

    mode: 'development',

    //entry:'指定要处理哪个文件'

    entry: path.join(__dirname, './src/index1.js'),

    //指定生成文件要存放的位置,默认是dist

    output: {

        //输出文件存放的路径

        path: path.join(__dirname,'./dist'),

        //生成的文件名

        filename: 'bundle.js'

    },

    //3.插件的数组,将来webpack在运行时,会加载并调用这些插件

    plugins: [htmlPlugin]

}

使用npm run dev运行,打开http://localhost:8080/

3.3 解惑 html-webpack-plugin

① 通过 HTML 插件复制到项目根目录中的 index.html 页面,也被放到了内存中

② HTML 插件在生成的 index.html 页面自动注入了打包的 bundle.js 文件(无需手动加入js文件了)

4. devServer 节点

在 webpack.config.js 配置文件中,可以通过 devServer 节点对 webpack-dev-server 插件进行更多的配置,

示例代码如下:

module.exports = {

    devServer: {

        //首次打包成功后,自动打开浏览器

        open: true,

        //在http协议中,如果端口号时80,则可以被省略

        port: 80,

        //指定运行的主机地址

        host: '127.0.0.1'

    }

}

注意:凡是修改了 webpack.config.js 配置文件,或修改了 package.json 配置文件,必须重启实时打包的服务器,否则最新的配置文件无法生效

6. webpack 中的 loader

1. loader 概述

在实际开发过程中,webpack 默认只能打包处理以 .js 后缀名结尾的模块。其他非 .js 后缀名结尾的模块

webpack 默认处理不了,需要调用 loader 加载器才可以正常打包,否则会报错!

loader 加载器的作用:协助 webpack 打包处理特定的文件模块。比如:

⚫ css-loader 可以打包处理 .css 相关的文件

⚫ less-loader 可以打包处理 .less 相关的文件

⚫ babel-loader 可以打包处理 webpack 无法处理的高级 JS 语法

2. loader 的调用过程

3. 打包处理 css 文件

① 运行 npm i style-loader@3.0.0 css-loader@5.2.6 -D 命令,安装处理 css 文件的 loader

② 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:

module.exports = {

    module: {

        rules:[

            //定义不同模块对应的loader

            {test:/\.css$/, use: ['style-loader','css-loader']}

        ]

    }

}

其中,test 表示匹配的文件类型use 表示对应要调用的 loader

//index1.js

//导入样式(在webpack中,一切皆可模块,都可以通过ES6语法导入和使用

//如果某个模块中,使用from接收到的成员为undefined,则没必要进行接收

import './css/index.css'

注意:

⚫ use 数组中指定的 loader 顺序是固定的

⚫ 多个 loader 的调用顺序是:从后往前调用

4. 打包处理 less 文件

① 运行 npm i less-loader@10.0.1 less@4.1.1 -D 命令

② 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:

5. 打包处理样式表中与 url 路径相关的文件

① 运行 npm i url-loader@4.1.1 file-loader@6.2.0 -D 命令

② 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:

其中 ? 之后的是 loader 的参数项

⚫ limit 用来指定图片的大小,单位是字节(byte)

⚫ 只有 limit 大小的图片,才会被转为 base64 格式的图片

如果需要调用的loader只有一个,传递一个字符串也行,如果有多个loader,必须指定数组

代码

//index1.js

import images from './images/pic.jpg'

$(".box").attr('src', images)

<!--index.html-->

<img src="" class="box">

6. 打包处理 js 文件中的高级语法

webpack 只能打包处理一部分高级的 JavaScript 语法。对于那些 webpack 无法处理的高级 js 语法,需要借

助于 babel-loader 进行打包处理。例如 webpack 无法处理下面的 JavaScript 代码:

6.1 安装 babel-loader 相关的包

运行如下的命令安装对应的依赖包:

npm i babel-loader@8.2.2 @babel/core@7.14.6 @babel/plugin-proposal-decorators@7.14.5 -D

在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:

注意:在配置babel-loader的时候程序员只需要把自己的代码进行转换即可;

一定要排除node_modules中的js文件,因为第三方包中的js兼容性,不需要程序员关心

6.2 配置 babel-loader

在项目根目录下,创建名为 babel.config.js 的配置文件,定义 Babel 的配置项如下:

module.exports = {

    plugins: [["@babel/plugin-proposal-decorators",{legacy: true}]]

}

7. 打包发布

1. 为什么要打包发布

项目开发完成之后,需要使用 webpack 对项目进行打包发布,主要原因有以下两点:

① 开发环境下,打包生成的文件存放于内存中,无法获取到最终打包生成的文件

② 开发环境下,打包生成的文件不会进行代码压缩和性能优化

为了让项目能够在生产环境中高性能的运行,因此需要对项目进行打包发布。

2. 配置 webpack 的打包发布

package.json 文件的 scripts 节点下,新增 build 命令如下:

--model 是一个参数项,用来指定 webpack 的运行模式。production 代表生产环境,会对打包生成的文件

进行代码压缩性能优化

注意:通过 --model 指定的参数项,会覆盖 webpack.config.js 中的 model 选项。

3. 把 JavaScript 文件统一生成到 js 目录中

webpack.config.js 配置文件的 output 节点中,进行如下的配置:

4. 把图片文件统一生成到 image 目录中

修改 webpack.config.js 中的 url-loader 配置项,新增 outputPath 选项即可指定图片文件的输出路径:

5. 自动清理 dist 目录下的旧文件

为了在每次打包发布时自动清理掉 dist 目录中的旧文件,可以安装并配置 clean-webpack-plugin 插件:

安装:

npm install clean-webpack-plugin --D

8. Source Map

1. 生产环境遇到的问题

前端项目在投入生产环境之前,都需要对 JavaScript 源代码进行压缩混淆,从而减小文件的体积,提高文件的

加载效率。此时就不可避免的产生了另一个问题:

对压缩混淆之后的代码除错(debug)是一件极其困难的事情

⚫ 变量被替换成没有任何语义的名称

⚫ 空行和注释被剔除

2. 什么是 Source Map

Source Map 就是一个信息文件,里面储存着位置信息。也就是说,Source Map 文件中存储着压缩混淆后的

代码,所对应的转换前的位置

有了它,出错的时候,除错工具将直接显示原始代码而不是转换后的代码,能够极大的方便后期的调试

3. webpack 开发环境下的 Source Map

开发环境下,webpack 默认启用了 Source Map 功能。当程序运行出错时,可以直接在控制台提示错误行

的位置,并定位到具体的源代码

3.1 默认 Source Map 的问题

开发环境下默认生成的 Source Map,记录的是生成后的代码的位置。会导致运行时报错的行数源代码的行

不一致的问题。示意图如下:

3.2 解决默认 Source Map 的问题

开发环境下,推荐在 webpack.config.js 中添加如下的配置,即可保证运行时报错的行数源代码的行数

保持一致:

4. webpack 生产环境下的 Source Map

生产环境下,如果省略了 devtool 选项,则最终生成的文件中不包含 Source Map。这能够防止原始代码

过 Source Map 的形式暴露给别有所图之人。

4.1 只定位行数不暴露源码

在生产环境下,如果只想定位报错的具体行数,且不想暴露源码。此时可以将 devtool 的值设置为

nosources-source-map。实际效果如图所示:

4.2 定位行数且暴露源码

在生产环境下,如果想在定位报错行数的同时展示具体报错的源码。此时可以将 devtool 的值设置为

source-map。实际效果如图所示:

采用此选项后:你应该将你的服务器配置为,不允许普通用户访问 source map 文件

5. Source Map 的最佳实践

① 开发环境下:

⚫ 建议把 devtool 的值设置为 eval-source-map

⚫ 好处:可以精准定位到具体的错误行

② 生产环境下:

⚫ 建议关闭 Source Map 或将 devtool 的值设置为 nosources-source-map

⚫ 好处:防止源码泄露,提高网站的安全性

方法1:build的时候在webpack.config.js中将devtool设置为nosources-source-map

//开发调试阶段,建议把devtool值设置为eval-source-map

// devtool: 'eval-source-map',

//发布,只显示行号不显示源码

devtool: 'nosources-source-map',

方法2: webpack.config.js 中devtool: 'eval-source-map',而在package.json中将build的命令修改为webpack --mode production --devtool nosources-source-map

这种方式,在执行执行npm run dev的时候使用的是eval-source-map,错误信息定位源码行数并且显示源码

在执行npm run build的时使用的是nosources-source-map,发布的代码执行的时候,错误信息定位源码行数并且显示源码

"scripts": {

  "dev": "webpack serve",

  "build": "webpack --mode production --devtool nosources-source-map"

},

实际开发中需要自己配置 webpack 吗?

答案:不需要

⚫ 实际开发中会使命令行工具(俗称 CLI一键生成带有 webpack 的项目

⚫ 开箱即用,所有 webpack 配置项都是现成的!

⚫ 我们只需要知道 webpack 中的基本概念即可!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值