记得某次考试,出国N年老师出的卷子全是英语,坑的英语不好的我们不要不要的。幸亏上了专业英语课。最重要的是专业英语对于我们很重要,比如webpack,一堆博客都是几小时入门,如何会用webpack,当你想用它的某种特性,比如异步加载moudle,用到require.ensure,或者一些很细节的api,一些遇到的问题,都是中文网站,博客解决不了的。曾经嘲笑那些学视频的自认为大神前端,你找个webpack中文详细教学视频看看。

[笑哭].这次,我们来copy一下webpack官网,学一下英语。

开始的motivition,why we do it.web app 能做很多事,我们能在浏览器里用js做更多的事…致使客户端有n多代码,我们需要一种代码加载,模块加载的东西。

Module systems offer the option to split your code base into modules.模块系统提供一个选项去把代码划分到模块里。

There are multiple(多重的;多个的;复杂的;多功能的;) standards for (标准)how to define dependencies and export values:下面列举了模块的标准,amd,cmd,es6的import等。

This is the way you would handle a modularized(模块化的)code base if you didn’t use a module system.

<script src="module1.js"></script>
<script src="module2.js"></script>
<script src="libraryA.js"></script>
<script src="module3.js"></script>

他们共同的问题Common problems

  • Conflicts in the global object.全局对象的冲突
  • Order of loading is important.加载的顺序
  • Developers have to resolve dependencies of modules/libraries.开发者需要解决模块和库的依赖问题
  • In big projects the list can get really long and difficult to manage.大工程的list很大很难管理

CommonJs: synchronous(同步) require cmd的同步加载

AMD: asynchronous require     amd的异步加载

他们的Pros(优点)Cons(缺点)就不写了。

ES6的模块加载机制

import "jquery";
export function doStuff() {}
module "localModule" {}

Pros

  • Static analysis is easy   静态分析是很容易的
  • Future-proof as ES standard  是未来的标准

Cons

  • Native browser support will take time  本地浏览器支持还需要一段时间
  • Very few modules in this style   还很少有模块是es6版的

TRANSFERRING

Modules should be executed on the client, so they must be transferred from the server to the browser.

There are two extremes on how to transfer modules: 模块应该在客户端执行,所以他们必须要从服务器端转换到浏览器,这有怎样转换模块的两个极端。

  • 1 request per module      每个模块一个需求
  • all modules in one request   所有模块都用一个需求

Both are used in the wild, but both are suboptimal: 这俩都是野办法,用的都是(次优的)不咋样。

  • 1 request per module

    • Pro: only required modules are transferred    只有加载的模块被转换了
    • Con: many requests means much overhead    更多的请求意味着更多的开销
    • Con: slow application startup, because of request latency   这个app启动很慢,因为请求的延迟
  • all modules in one request    
    • Pro: less request overhead, less latency     更少的请求开销和延迟
    • Con: not (yet) required modules are transferred too   未请求的模块也被转换了

Chunked transferring   分块转换(chunk)

A more flexible transferring would be better. A compromise between the extremes is better in most cases.一个更加复杂的转换可能是更好的,在大多数情况下,极端之间的妥协是更好的。

→ While compiling all modules: Split the set of modules into multiple smaller batches (chunks). 编译所有模块的时候,把这个模块切分到一些更小的分支,也就是每个chunk

We get multiple smaller requests. Chunks with modules that are not required initially(最初)are only requested on demand(需求), The initial request doesn’t contain your complete code base and is smaller.我们得到一些更小的请求,modules的chunks没有加载最初的,仅加载了需要的chunk,初始请求不包含你完整的代码库,它更小。

The “split points” are up to the developer and optional.划分成chunk这点是开发者可选的。

→ A big code base is possible!

Note: The idea is from Google’s GWT.

Read more about Code Splitting.

WHY ONLY JAVASCRIPT?

Why should a module system only help the developer with JavaScript? There are many other static resources that need to be handled:为啥模块系统只能服务于js开发者?这里这些静态资源都需要被处理。

  • stylesheets
  • images
  • webfonts
  • html for templating
  • etc.

And also:

  • coffeescript → javascript
  • elm → javascript
  • less stylesheets → css stylesheets
  • jade templates → javascript which generates html
  • i18n files → something
  • etc.

This should be as easy as:

require("./style.css");
require("./style.less");
require("./template.jade");
require("./image.png");

Read more about Using loaders and Loaders.

STATIC ANALYSIS

When compiling all the modules a static analysis tries to find dependencies.当编译所有模块的时候,静态分析试着去寻找依赖。

Traditionally this could only find simple stuff without expression, but i.e. require("./template/" + templateName + ".jade") is a common construct.

传统上只能找到简单的依赖但是不被解析。但是ie里面require("./template/" + templateName + ".jade")是公认的结构

Many libraries are written in different styles. Some of them are very weird…许多库都用不同方式写,而许多都是很奇怪的。。。

webpack入门(一)webpack的动机 ---前端专业英语的更多相关文章

  1. Webpack入门——使用Webpack打包Angular项目的一个例子

    2016.1.22,对大多数人来说,这是一个非常平常的日子,但这却是我决定在博客园写博客的日子.虽然注册博客园的博客已有4年8个月,却一直没有动手写过一篇博客,原因是觉得自己水平不行,写不出好东西,所 ...

  2. webpack入门--前端必备

    webpack入门--前端必备 什么是 webpack? webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来 ...

  3. webpack入门之简单例子跑起来

    webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载的模块进行代码分割,等到实际需要的时 ...

  4. Webpack 入门指南 - 2.模块

    这一次我们谈谈模块问题. 通常我们希望这个项目可以分为多个独立的模块,比如,上一次提高的 hello 函数,如果我们定义为一个模块,其它模块引用之后,直接调用就好了.在前端怎么使用模块呢?这可说来话长 ...

  5. webpack入门必知必会

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 这是我第一篇介绍webpack的文章,先从一个入门教程开始吧,后续会有更多相关webpack的文章推 ...

  6. webpack入门+react环境配置

    小结放在前:这篇文章主要是为下一篇的react提前铺好路,webpack是一个前端资源模块化管理和打包工具,说白了就是方便我们管理自己的常用的一些代码,比如你开发中用到sass以及jade同时用到es ...

  7. Webpack 入门教程

    Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 本章节基于 Webpack3.0 测试通过. 从图中我们可以看出,W ...

  8. webpack入门-个人学习资源收集

    本来是想自己写哈个人学习webpack心德的,不过网上现在已经有各种比较好的,详细的入门或者深入资源了. 所以我就简单总结了一下,我在入门webpack时看的一些博客和文档,以及顺道看到的一些觉得也应 ...

  9. webpack快速入门——给webpack增加babel支持

    1.Babel的安装与配置 Babel其实是几个模块化的包,其核心功能位于称为babel-core的npm包中,webpack可以把其不同的包整合在一起使用,对于每一个 你需要的功能或拓展,你都需要安 ...

随机推荐

  1. day 7-4 互斥锁与队列

    一. 基本定义 互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制.该目的通过将代码切片成一个 ...

  2. 关于golang.org/x包问题

    关于golang.org/x包问题 由于谷歌被墙,跟谷歌相关的模块无法通过go get来下载,解决方法: git clone https://github.com/golang/net.git $GO ...

  3. python[练习题]:实现Base64编码

    要求自己实现算法,不用库. Base64简介: Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多 ...

  4. MCV 和 MTV框架基本信息

    一 . MCV # web服务器开发最著名的MVC模式 M : model.py 就是和数据库打交道的, 创建表等操作 V : view 视图(视图函数,就是装HTML文件的) C : control ...

  5. linux audit审计(5)--audit规则配置

    audit可以配置规则,这个规则主要是给内核模块下发的,内核audit模块会按照这个规则获取审计信息,发送给auditd来记录日志. 规则类型可分为: 1.控制规则:控制audit系统的规则: 2.文 ...

  6. Yii2的save()方法容易出错的地方

    如果save()返回true, 但是数据没有保存成功,则应该是开启了事务且已经回滚 如果save()返回false, 则使用$model->errors查看错误原因 可以设置$model的场景, ...

  7. pip install MySQL-python 失败

    1. EnvironmentError: mysql_config not found原因:/usr/bin/mysql_config没有次文件,要安装libmysqlclient-dev, apt ...

  8. VS2017设置背景主题

    一.VS2017设置背景主题 1.下载并安装Color Theme Editor for Visual Studio 2017和MoeIDE (图中红圈中的两个插件,工具-扩展和更新-联机-右上角搜索 ...

  9. border-color的深入理解

    .className{ width:100px;height:100px; border:100px solid; border-color: red green blue orange; } 最终的 ...

  10. class前置声明

    https://www.cnblogs.com/King-Gentleman/p/5081159.html 当两个头文件互相包含的时候,类定义会编译出错,这时需要分别添加上对应的类声明 #includ ...