本系列文章实际上就是官网文档的翻译加上自己实践过程中的理解。

  

  伴随着websites演化至web apps的过程,有三个现象是很明显的:

  1. 页面中有越来越多的Js。
  2. 客户端能做的事情越来越多。
  3. 越来越少的页面重载(当然也伴随着更复杂的代码)。

  这些现象导致了什么?大量的前端代码。  

  庞大的代码库需要被高效的组织。而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

   组件虽然被执行于客户端,但不可避免需要经由服务器传送。

   关于组件的传送,有两个极端:

  1. 每个组件,一个HTTP请求。

    • 优点:仅仅传送依赖项。
    • 缺点:请求多,负载高,更慢的启动延迟。
  2. 所有的组件,一个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的原因的更多相关文章

  1. webpack学习笔记——sourcemap(使用webpack打包的项目如何调试代码)

    [webpack]devtool里的7种SourceMap模式是什么鬼? 里面详细介绍了7种模式的区别,和建议使用. webpack sourcemap 选项多种模式的一些解释 两篇文章大同小异,第一 ...

  2. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  3. webpack学习(六)—webpack+react+es6(第3篇)

    接上篇 : webpack学习(六)—webpack+react+es6(第2篇) 上篇其实是有问题的,问题在取服务器数据这块.this.props 表示那些一旦定义,就不再改变的特性,而 this. ...

  4. webpack学习(六)—webpack+react+es6(第2篇)

    接上篇        webpack学习(五)—webpack+react+es6(第1篇) 本文做个简单的图片加文字的页面.其中,配置文件跟上篇一致.项目结构: index.html <!DO ...

  5. C++ GUI Qt4学习笔记01

    C++ GUI Qt4学习笔记01   qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...

  6. SaToken学习笔记-01

    SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...

  7. Redis:学习笔记-01

    Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...

  8. 学习webpack基础笔记01

    学习webpack基础笔记 1.webpack搭建环境最重要的就是如何使用loader和plugins,使用yarn/npm安装插件.预处理器,正确的配置好去使用 2.从0配置webpack - 1. ...

  9. 【原】webpack学习笔记

    之前在react的项目中有用过webpack,不过没有认真的去研究,这段时间又重新好好的学习一下webpack,发觉 webpack是一个很强大的东西.而且很好用,方便,接下来主要是做一下学习的笔记 ...

随机推荐

  1. 文件系统取证分析(第11章:NTFS概念)

    /* Skogkatt 开始翻译于2015-01-24,仅作为学习研究之用,谢绝转载. 2015-01-31更新MFT entry 属性概念. 2015-02-01翻译完成. 译注:我翻译这本书的这三 ...

  2. 数据库中GUID的生成

    GUID, 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算法产生 ...

  3. ORA-00845: MEMORY_TARGET not supported on this system

    cd $ORACLE_HOME cd dbs cat init.ora cat spfilematedata.ora 查看MEMORY_TARGET设置的大小 修改系统,设置shm的大小大于MEMOR ...

  4. windows对象分类

    用户对象 GDI对象 内核对象 如何判断一个对象是不是内核对象 看创建函数,几乎所有的内核对象创建函数都会有PSECURITY_ATTRIBUTES参数

  5. 浅谈 cookie 和 session

    1.关闭浏览器后,session是否还存在? session在服务器和客户端各保留一个副本,关闭浏览器与否和session是否存在没有任何关系. session采取的是服务器端保持状态的方案,它存储在 ...

  6. flask页面操作gpn接口

    https://wizardforcel.gitbooks.io/flask-extension-docs/content http://cabeza.cn/blog/2016/02/28/datat ...

  7. spring+hibernate--直接修改数据库,再通过hibernate查询数据不变

    这个问题已经很多天了,一直没有时间解决,不过还好是自己的项目,没什么影响. 刚好今天没事,想好好解决一下这个问题. hibernate主要配置如下: <property name="h ...

  8. ntfs安全权限和共享权限的区别

    win xp 最大分区32G,最大文件大小4G. 共享权限是为网络用户设置的,NTFS权限是对文件夹设置的. 用户对文件夹有什么权限就是看NTFS权限的设置. 如果一个文件夹设置成共享,其具体的权限还 ...

  9. poj1019_Number_Sequence

    这题目关键是打表,haha[k]数组表示的是S1S2..Sk该串结尾所在的位置.然后用n去找n所在的k值,此时haha[k-1]<n<=haha[k].然后再算出从haha[k]位置到n一 ...

  10. Linux下查看文件属性

    1.ls ls -a 查看所有文件,就是包含隐藏文件 ls -l 查看详细的属性,包括文件类型(d表示目录,-表示普通文件,l表示链接文件),文件的权限(所有者权限,所属组权限,其他人权限),所有者, ...