webpack 学习笔记 01 使用webpack的原因
本系列文章实际上就是官网文档的翻译加上自己实践过程中的理解。
伴随着websites演化至web apps的过程,有三个现象是很明显的:
- 页面中有越来越多的Js。
- 客户端能做的事情越来越多。
- 越来越少的页面重载(当然也伴随着更复杂的代码)。
这些现象导致了什么?大量的前端代码。
庞大的代码库需要被高效的组织。而Module(组件式)开发的系统即为大多数开发者采取的途径。
MODULE SYSTEM STYLES
有很多种定义依赖,导出变量的标准或者说方法:
- <script> tag 的形式(不通过组件系统)
- CommonJs
- Amd形式
- ES6组件
- 各种其它风格。。
<script>tag形式
在非组件系统中,我们的模块化后的代码是这样被组织的。
<script src="module1.js"></script>
<script src="module2.js"></script>
<script src="libraryA.js"></script>
<script src="module3.js"></script>
各个组件向全局变量提供了一个个接口(如:浏览器环境的 window对象)。之后,借助全局对象,我们就能使用这些组件。
痛点
- 全局对象可能会有属性间冲突(这就是Jquery提供了给$重命名途径的原因)
- 我们需要关心组件加载的顺序(先加载依赖项)
- 开发者需要花很多精力来解决依赖问题。
- 在较大的项目中,tag列表将会变得非常的大且难于维护。
CommonJs:同步式的require
这种风格的组件系统使用同步的形式来加载依赖项,并返回导出的接口。每一个组件可以借助exports对象或者配置module.exports来导出接口(Node.js开发者再熟悉不过了)。
require("module");
require("../file.js");
exports.doStuff = function() {};
module.exports = someValue;
优点
- 适合用作后端的组件(一次性加载到Cache以重用)
- 已经有了很多此风格的组件(NPM)
- 简单易用
痛点
- 阻塞式,不适合前端。
典例
- node.js
- browserify
- modules-webmake
- wreq
AMD:异步式的require
AMD的全称是Asynchronous Module Definition,很多需要用到组建式系统,但又感受到它们在前端的痛点的开发者建设了AMD。
require(["module", "../file"], function(module, file) { /* ... */ });
define("mymodule", ["dep1", "dep2"], function(d1, d2) {
return someExportedValue;
});
优点
- 异步加载,适合前端环境。
- 并行加载,带来速度提升。
痛点
- 带来了更多的代码工作量。
典例
- require.js
- curl.js
ES6组件
From EcmaScript6
import "jquery";
export function doStuff() {}
module "localModule" {}
虽然是标准,但是被浏览器广泛支持还需要一段时间。
TRANSFERRING
组件虽然被执行于客户端,但不可避免需要经由服务器传送。
关于组件的传送,有两个极端:
- 每个组件,一个HTTP请求。
- 优点:仅仅传送依赖项。
- 缺点:请求多,负载高,更慢的启动延迟。
- 所有的组件,一个HTTP请求。
- 优点:更快,更低延迟。
- 传送了没必要传的东西。
让我们在两者间做一个妥协。在大多数情况下,以下的方法将更为适用:
->在编译所有的组件时,将组件分为多种批次(chunks or batches)。
再某个批次再被需要的时候,再发送他们。
解决了前者带来的请求的高延迟、高负载,后者带来的无必要信息的传送。
那么,问题来了,这个分批次由谁来做?
webpack。
当然,gulp,grunt也是时下很火的可选项。具体工具的选型,仁者见仁,智者见智。
WHY ONLY JAVASCRIPT?
组件化系统难道就只能为javascript服务吗?前端还需要解决的问题有
- 样式表
- 图片
- 字体
- 模版
- coffeescript -> js
- less -> css
- jade -> html
- 各种。。。。。。
没错,这些,webpack也能搞定
require("./style.css");
require("./style.less");
require("./template.jade");
require("./image.png");
webpack 学习笔记 01 使用webpack的原因的更多相关文章
- webpack学习笔记——sourcemap(使用webpack打包的项目如何调试代码)
[webpack]devtool里的7种SourceMap模式是什么鬼? 里面详细介绍了7种模式的区别,和建议使用. webpack sourcemap 选项多种模式的一些解释 两篇文章大同小异,第一 ...
- 软件测试之loadrunner学习笔记-01事务
loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...
- webpack学习(六)—webpack+react+es6(第3篇)
接上篇 : webpack学习(六)—webpack+react+es6(第2篇) 上篇其实是有问题的,问题在取服务器数据这块.this.props 表示那些一旦定义,就不再改变的特性,而 this. ...
- webpack学习(六)—webpack+react+es6(第2篇)
接上篇 webpack学习(五)—webpack+react+es6(第1篇) 本文做个简单的图片加文字的页面.其中,配置文件跟上篇一致.项目结构: index.html <!DO ...
- C++ GUI Qt4学习笔记01
C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...
- SaToken学习笔记-01
SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...
- Redis:学习笔记-01
Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...
- 学习webpack基础笔记01
学习webpack基础笔记 1.webpack搭建环境最重要的就是如何使用loader和plugins,使用yarn/npm安装插件.预处理器,正确的配置好去使用 2.从0配置webpack - 1. ...
- 【原】webpack学习笔记
之前在react的项目中有用过webpack,不过没有认真的去研究,这段时间又重新好好的学习一下webpack,发觉 webpack是一个很强大的东西.而且很好用,方便,接下来主要是做一下学习的笔记 ...
随机推荐
- ubuntu 更新重启后 登录后 无法进入图形界面
切换到控制台然后看看-/.Xauthority的组属性是否正确,如果被改成root组了,就会造成不能登陆,你将其删除就ok了
- Spring 注解实体类中非数据库字段属性
解决办法:在属性的get方法上加上一段注解标识它是临时属性,不是数据库字段就OK @Transient public List<Reverts> getChildList() { retu ...
- .net orm比较之dapper和Entity Framework6的简单测试比较
.net orm比较之dapper和Entity Framework6的简单测试比较
- Objective-C中#define的常见用法
参考博客 http://blog.csdn.net/kindazrael/article/details/8108868 在C语言中,预处理代码是非常强大的工具,能让代码变得可读性和可维护性更强.预处 ...
- Windows phone 8 学习笔记(9) 集成(转)
本节整理了之前并没有提到的Windows phone 8 系统相关集成支持,包括选择器.锁定屏幕的.联系人的访问等.选择器列举了若干内置应用提供的相关支持:锁定屏幕展示了我们可以对锁定屏幕提供背景图像 ...
- 如何利用jq来实现复选框的全选,反选!
$("document").ready(function(){ $("#btn1").click(function(){ $("[name='chec ...
- hbase查询,scan详解
一.shell 查询 hbase 查询相当简单,提供了get和scan两种方式,也不存在多表联合查询的问题.复杂查询需通过hive创建相应外部表,用sql语句自动生成mapreduce进行.但是这种简 ...
- javascript之delete操作符
理解delete 理论 代码段的类型 执行上下文 活动对象 / 变量对象 属性的特性 内置属性与 DontDelete 未声明的赋值 Firebug的困惑 在eval中删除变量 浏览器兼容性 Geck ...
- Android事件
1.Java package com.fish.helloworld; import android.app.Activity; import android.graphics.Color; impo ...
- C#局域网桌面共享软件制作(三)
到周末了,继续做这个桌面共享软件,下面是前两篇的链接, 链接 C#局域网桌面共享软件制作(一) 链接 C#局域网桌面共享软件制作(二) 通过对图片进行压缩以后,每张图片大小38K左右(win7/102 ...