webpack入门进阶调优第一章

1.1何为Webpack

webpack是开源的JS模块打包工具

核心功能是解决模块之间的依赖,吧哥哥模块按照特定的规则和顺序组织在一起,最终合并为一个JS文件。这个过程叫模块打包

1.2为何需要Webpack

1.2.1何为模块

在设计程序结构时,更好的组织方式是按照特定的功能将其拆分为多个代码段,每个代码段实现一个特定的目的。可进行独立的设计开发测试,最终通过接口来组合在一起,这就是基本的模块化思想。

1.2.2 JavaScript中的模块

JavaScript中没有模块,Brendan Rich最初设计语言只定位成小型脚本语言。再过去很长时间只能通过script标签将他们一个个插入页面,缺点很多:

  • 需要手动维护加载顺序,依赖关系隐式
  • 每个script意味一次请求,拖慢网页渲染速度
  • 每个script标签顶层作用域即全局作用域,容易造成全局作用域的污染。

模块化解决了上述问题:

  • 通过导入导出语句清晰看到模块间的依赖关系
  • 模块可以借助工具进行打包,在页面中只需要加载合并后的资源文件,减少网络开销
  • 多个模块之间作用域隔离,彼此不会用命名冲突

2015年, ES6正式定义了JavaScript模块标准!已得大多数现代浏览器支持,但实际应用方面还需要等待一段时间,主要原因:

  • 无法使用 code splitting 和 tree shaking
  • 大多数npm模块还是CommonJS形式,浏览器不支持其语法,没法世界拿来用
  • 仍然需要考虑个别浏览器及平台的兼容性问题

那么,如何让我们的工程在使用模块化的同时也能正常运行在浏览器中,就到了模块打包工具的出场了。

1.2.3模块打包工具

任务是解决模块间的依赖,使其打包后的结果能运行在浏览器上。工作方式主要分两种:

  • 将存在依赖关系的模块按照特定规则合并为单个JS文件,一次全部加载进页面
  • 在页面初始时加载一个入口模块,其他模块一步的进行加载

目前社区中比较流行的模块打包工具Webpack、Parcel、Rollup等

1.2.4 为何选择Webpack

1) Webpack默认支持多种模块标准,包括AMD、CommonJS,以及最终的ES6模块

2)Webpack有完备的代码分割(code splitting)解决方案

3)Webpack可以处理各种类型的资源

4)Webpack拥有庞大的社区支持。

1.3安装

安装Node.js环境

node -v
npm -v

npm安装Webpack方式:一种全局安装,一种本地安装

全局安装Webpack好处是npm帮我们绑定一个命令行环境变量,一次安装处处运行

本地安装则会添加其成为项目中的依赖,只能在项目内部使用。

建议本地安装方式,主要原因:

  • 全局安装与他人进行项目协作时,由于每个人系统中Webpack版本不同,可能会导致输出结果不一致
  • 部分依赖于Webpack的插件会调用项目中的Webpack的内部模块,这种情况下仍然需要在项目本地安装Webpack,而如果全局本地都用则容易混淆

新建一个工程目录

npm init

生成一个package.json文件

安装Webpack命令

npm i webpack webpack-cli --save-dev

webpack是核心模块,webpack-cli则是命令行工具,在本例中两者是必需的

安装结束后,在命令行执行npx webpack -v 以及 npx webpack-cli -v 可显示各自的版本号,即证明安装成功

1.4打包第一个应用

工程目录添加以下几个文件

index.js

import addContent from "./add-content.js";
document.write("my first Webpack app.<br />");
addContent();

add-content.js

export default function () {document.write("Hello world!");
}

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>My first Webpack app.</title></head><body><script src="./dist/bundle.js"></script></body>
</html>

在控制台输入打包命令

npx webpack --entry=./index.js --output-filename=bundle.js --mode=development

打包效果

用浏览器打开index.html,如图

 

 回顾指令

entry是资源打包入口。webpack从这里开始进行模块查找

output-filename是输出资源名,打包完成出现dist目录包含bundle.js是Webpack打包结果

mode是打包模式(development、production、none),当置于development和production模式下自动添加适合当前模式的一系列配置,减少人为工作量。开发环境一般设置为development模式

1.4.2使用npm script

为了使命令行指令简洁,我们可以在package.json中添加一个脚本命令

"scripts": {"build": "webpack --entry=./index.js --output-filename=bundle.js --mode=development"},

重新打包输入npm命令即可

npm run build

1.4.3使用默认目录配置

通常我们分别设置源码目录与资源输出目录

工程中创src目录,并将index.js和add-content.js移动到该目录下,资源输出目录,Webpack已经默认是/dist,源代码入口Webpack默认就是src/index.js。可以省略掉entry配置

编辑package.json:

"scripts": {"build": "webpack --output-filename=bundle.js --mode=development"},

1.4.4使用配置文件

 Webpack有非常多的配置项以及对应的命令行参数

npx webpack -h

当项目需要越来越多的配置项时,命令维护困难。所以创建一个配置文件,在Webpack每次打包是读取该配置即可

工程下创建 webpack.config.js

module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",},mode: "development",
};

值得注意的是Webpack对于output.path的要求是使用绝对路径(从系统根目录开始的完整路径),之前我们在命令行中为了简洁所以使用了相对路径,而在webpack.config.js中,我们通过调用node.js的路径拼装函数——path.join,将__dirname与dist连接起来,得到了最终的资源输出路径。

去掉package.json中配置的打包参数了

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

1.4.5webpack-dev-server

提高调试效率的本地开发工具 文件修改,自动刷新

npm install webpack-dev-server --save-dev

ps:--save-dev将工具作为devDependencies开发环境依赖,工程上线时要进行依赖安装可以通过

npm install --production过滤掉devDependencies中的模块

为了便捷启动webpack-dev-server,添加dev指令

"scripts": {"dev": "webpack-dev-server","build": "webpack"},

更改webpack.config.js

module.exports = {entry: "./src/index.js",output: {filename: "./bundle.js",},mode: "development",devServer: {publicPath: '/dist',}
};

添加devServer对象专门放webpack-dev-server配置。webpack-dev-server可以看做服务者,接收浏览器请求,将资源返回。当服务启动时,会先让Webpack进行模块打包并将资源准备好。当接收到浏览器的资源请求时,会首先进行URL地址校验。如果改地址是资源服务地址(上面配置的publicPath),就从打包结果中寻找该资源返回浏览器。反之,地址不属于资源服务地址,则直接读取硬盘中的源文件并将其返回。

webpack-dev-server两大职能:

1.令Webpack进行模块打包,并处理静态资源文件请求

2.作为普通的Web Server,处理静态资源文件请求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python类的空间问题及类之间的关系

类的空间问题及类之间的关系 类的空间问题 1.何处可以添加对象属性 class A:def __init__(self,name):self.name namedef func(self,sex):self.sex sexobj A("alex") obj.age 18 # 通过__init__方法添加 print(obj.__dict__) obj1 A("wusir") obj.fun…

麻省理工学生发明 震惊世界

核心提示&#xff1a;在普拉纳夫看来&#xff0c;数字信息以像素的形式被限制在显示屏幕之中。他发明的"第六感装置"震惊全场&#xff0c;让世界为之惊叹。 MIT(麻省理工)印度裔学生Prarnav Mistry的天才发明:“第六感装置” 视频地址&#xff1a;http://v.youku.com…

Java生鲜电商平台-优惠券系统的架构设计与源码解析

Java生鲜电商平台-优惠券系统的架构设计与源码解析 电商后台&#xff1a;实例解读促销系统 电商后台系统包括商品管理系统、采购系统、仓储系统、订单系统、促销系统、维权系统、财务系统、会员系统、权限系统等&#xff0c;各系统之间相互关联、相互依托&#xff0c;为前端的正…

VC 2010下安装OpenCV2.4.4

说明&#xff1a; 安装平台&#xff1a;32位XP&#xff0c;VS2010&#xff1b;OpenCV 2.4.4不支持VC 6.0&#xff1b;网上有很多用CMake编译OpenCV的安装教程&#xff0c;这里建议先不要自己编译&#xff0c;如果使用预编译好的库有问题&#xff0c;再尝试自己编译。希望大家好…

vue3源码中的最长递增子序列

求解最长递增子序列是一道经典的算法题, 多数解法是使用动态规划的思想&#xff0c;算法的时间复杂度是O(); 而Vue.js内部使用的是维基百科提供的一套“贪心二分查找”的算法; 贪心算法的时间复杂度是O(n)&#xff0c;二分查找的时间复杂度是O(logn)&#xff0c;总时间复杂度…

Java编程基础阶段笔记 day04 Java基础语法(下)

​ 面向对象编程 笔记Notes 面向对象三条学习主线 面向过程 VS 面向对象 类和对象 创建对象例子 面向对象的内存分析 类的属性&#xff1a;成员变量 成员变量 VS 局部变量 类的方法 方法的重载 可变个数形参 面向对象&#xff1a;封装性 访问权限修饰符 构造方法&…

汉诺塔递归算法

起源&#xff1a; 汉诺塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子…

Java编程基础阶段笔记 day 07 面向对象编程(上)

​ 面向对象编程 笔记Notes 面向对象三条学习主线 面向过程 VS 面向对象 类和对象 创建对象例子 面向对象的内存分析 类的属性&#xff1a;成员变量 成员变量 VS 局部变量 类的方法 方法的重载 可变个数形参 面向对象&#xff1a;封装性 访问权限修饰符 构造方法&…

Vue/Angular中父窗口新开的子窗口关闭的时候刷新父窗口

最近遇到一个项目需求&#xff1a;Angular中父窗口新开的子窗口提交完信息关闭的时候刷新父窗口。 知识点&#xff1a; window.opener 概述 返回打开当前窗口的那个窗口的引用&#xff0c;例如&#xff1a;在window A中打开了window B&#xff0c;B.opener 返回 A. 语法 …

HDU 6631 line symmetric(枚举)

首先能想到的是至少有一对相邻点或者中间间隔一个点的点对满足轴对称&#xff0c;那么接下来只需要枚举剩下的点对是否满足至多移动一个点可以满足要求。 第一种情况&#xff0c;对于所有点对都满足要求&#xff0c;那么Yes。 第二种情况&#xff0c;有一个点不满足要求&#x…

学习数字图像处理经验谈

一、面向应用&#xff1a;层层分解、抓住要点 我们学习数字图像处理的最终目的还是应用&#xff0c;不管是用它来研制产品还是研发项目抑或是研究课题&#xff0c;都要用数字图像处理的理论、方法和技术来解决实际问题。在此过程中&#xff0c;提高效率是非常重要的&#xff0c…

react-router-dom@6获取路由传参

目录 参数获取 1、子路由形式携带 2、问号(?)形式参数 3、事件跳转传参 router/index.tsx import App from "App"; import Home from "pages/Home"; import List from "pages/List"; import Detail from "pages/Detail"; import…

koa洋葱模型

Koa 和 Express 都会使用到中间件 Express的中间件是顺序执行&#xff0c;从第一个中间件执行到最后一个中间件&#xff0c;发出响应如上图 Koa是从第一个中间件开始执行&#xff0c;遇到 next 进入下一个中间件&#xff0c;一直执行到最后一个中间件&#xff0c;在逆序&#x…

koa后端允许跨域

举个例子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-width…

python面向对象之继承

面向对象之继承 什么是面向对象的继承&#xff1f; 继承&#xff08;英语&#xff1a;inheritance&#xff09;是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B&#xff0c;就把这个A称 为“B的子类别”&#xff0c;而把B称为“A的父类别”也可以称“B是…

美国正面临“人才泡沫”破裂危机?

&#xff08;Jason Lane和Kevin Kinser/文&#xff09;最近&#xff0c;与教育有关的种种问题在美国社会引起了广泛讨论。首先巨额的学生贷款问题&#xff1a;根据美联储纽约分行在2012年11月发布的一份报告&#xff0c;全美学生贷款总额已经达到420亿美元&#xff0c;其中新增…

ngrx学习笔记

什么是ngrx ngrx是Angular基于Rxjs的状态管理&#xff0c;保存了Redux的核心概念&#xff0c;并使用RxJs扩展的Redux实现。使用Observable来简化监听事件和订阅等操作。 在看这篇文章之前&#xff0c;已经假设你已了解rxjs和redux。 有条件的话请查看官方文档进行学习理解。 所…

.slice(0)

高手代码里看到.slice(0)&#xff0c;查了下这样写的好处&#xff1a; 1.对原数组进行深拷贝&#xff0c;这样进行一系列操作的时候就不影响原数组了&#xff1b; 2.将类数组对象转化为真正的数组对象&#xff1a;var anchorArray [].slice.call(document.getElementsByTagN…

亲历2013年TED大会:全球最潮灵感大会

本文转自&#xff1a;http://mooc.guokr.com/opinion/436837/ 本文由《外滩画报》供稿 文/华琪&#xff08;发自美国&#xff09; 编辑/吴慧雯 什么是TED的世界&#xff1f;在这里&#xff0c;你可以轻易发现各种名人出没的痕迹&#xff0c;和各个领域里最具远见卓识和创造…

Java生鲜电商平台-电商会员体系系统的架构设计与源码解析

Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明&#xff1a;Java生鲜电商平台中会员体系作为电商平台的基础设施&#xff0c;重要性不容忽视。我去年整理过生鲜电商中的会员系统&#xff0c;但是比较粗&#xff0c;现在做一个最好的整理架构. 设计电商会员体系需…