webpack,http整理篇

webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

const path = require('path');
module.exports = {
  // 单/多入口 entry: string|Array<string>|{[entryChunkName: string]: string|Array<string>} 
  entry: './src/index.js',   // 或 entry: {main: './src/index.js'}
  // 输出 output 属性告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件。主要输出文件的默认值是 ./dist/main.js,其他生成文件默认放置在 ./dist 文件夹中
  output: {
      path: path.resolve(__dirname, 'dist'),
      filename: 'my-first-webpack.bundle.js'
  },
  // loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中
  module: {
    rules: [
      { test: /\.txt$/, use: 'raw-loader' },
      {
        test: /\.css$/i,
        use: ['style-loader', 'css-loader'],
      }
    ]
  },
  // 插件可用于打包优化,资源管理,注入环境变量等
  plugins: [
    new HtmlWebpackPlugin({template: './src/index.html'})
  ],
  // 模式,4.0版本新增, development|production|none
  mode: 'production',  //默认
  // 开发服务器配置
  devServer: {
    index: 'index.html',
    lazy: true,  // 懒惰模式,不监视任何文件修改
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    port: 9000,
    host: '0.0.0.0',
    hot: true
  }
};

grunt,gulp,webpack

前端工程化的早期,主要是解决重复任务的问题。Grunt、Gulp就是其中代表。比如: 压缩、编译less、sass、地址添加hash、替换等,而如今的Webpack更像一套前端工程化解决方案。利用强大插件机制,解决前端静态资源依赖管理的问题。

 Grunt和Gulp属于任务流工具Tast Runner,Gulp吸取了Grunt的优点,拥有更简便的写法,通过流(Stream)的概念来简化多任务之间的配置和输出,让任务更加简洁和容易上手;webpack属于模块打包工具 Bundler

Webpack作者Tobias回复与 Grunt Gulp NPM脚本的比较

  • Tobias: NPM脚本对我而言足矣。实际上,说webpack是Grunt/Gulp的替代器并不完全准确。Grunt和Gulp以及NPM脚本都是任务执行程序。

  • Webpack是模块打包程序。这两类程序的目标不一样。但webpack简化了必须“过度使用”Grunt和Gulp和NPM脚本才能实现的Web开发任务也是事实。NPM脚本才是Grunt和Gulp的替代品。
    不过,除了纯粹的构建之外,任务运行程序也有存在的理由,比如部署、代码检查、版本管理,等等。

Grunt与Gulp性能比较

  • Grunt: 每个任务处理完成后存放在本地磁盘.tmp目录中,有本地磁盘的I/O操作,会导致打包速度比较慢。
// Gruntfile.js
module.exports = function(grunt) {
  grunt.initConfig({
    // js格式检查任务
    jshint: {
      src: 'src/test.js'
    }
    //  代码压缩打包任务
    uglify: {}
  });
  // 导入任务插件
  grunt.loadnpmTasks('grunt-contrib-uglify');
  // 注册自定义任务, 如果有多个任务可以添加到数组中
  grunt.regusterTask('default', ['jshint'])
}
// gulpfile.js
var gulp = require('gulp');
var jshint = require('gulp-jshint');
var uglify = require('gulp-uglify');

// 代码检查任务 gulp 采取了pipe 方法,用流的方法直接往下传递
gulp.task('lint', function() {
  return gulp.src('src/test.js')
    .pipe(jshint())
    .pipe(jshint.reporter('default'));
});

// 压缩代码任务
gulp.task('compress', function() {
  return gulp.src('src/test.js')
    .pipe(uglify())
    .pipe(gulp.dest('build'));
});

// 将代码检查和压缩组合,新建一个任务
gulp.task('default', ['lint', 'compress']);

运行机制

  • grunt gulp 思路
    【遍历源文件】->【匹配规则】->【打包】
    做不到按需加载,对打包的资源,是否用到,打包过程不关心。

  • webpack
    【入口】->【模块依赖加载】->【依赖分析】->【打包】
    在加载、分析、打包的过程中,可以针对性的做一些解决方案。比如:code split(拆分公共代码)

Gulp vs Grunt

  • 乍一看,Grunt和Gulp的基本功能似乎并没有太大区别。两种自动化工具都可以在MIT许可下使用,因此源代码是开放的并且免费提供。这两个应用程序都可以从命令行进行控制,并具有自己的界面。任务运行者还使用相同的包管理器npm。由于它们的插件目录很大,Grunt和Gulp都可以轻松地自动化大量任务。如果没有所需过程的扩展,则可以使用两种工具对其进行编程,尽管由于结构复杂,两个任务运行者都需要JavaScript和node.js的知识。

  • 但是,虽然Gulp主要基于node.js模块流,但Grunt主要使用fs(文件系统)模块,这突出了这两个工具之间最重要的区别之一:Grunt严格面向文件并创建临时本地文件在执行任务期间。另一方面,Gulp 通过内存处理这些进程,并将它们立即写入目标文件中,从而使程序具有速度优势。

  • 第二个区别特征是两种解决方案的各自概念。Grunt的编程和结构为用户提供了一些指导。已经定义了位于此处的已完成任务,然后必须对其进行简单配置。相比之下,Gulp通过仅提供单个模块为独立编程提供了更多的空间。一方面,这使得更容易理解背景和上下文,同时也要求用户更多。一个项目越大,Gulp的优势就越发挥作用,这就是为什么新的任务执行者现在成为许多人的首选的原因。但是由于较低的要求,Grunt仍然是较小的,可管理的项目。

http

概念:超文本传输​​协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。该协议虽然通常基于 TCP/IP 层,但可以在任何可靠的传输层上使用;也就是说,不像 UDP,它是一个不会静默丢失消息的协议。RUDP——作为 UDP 的可靠化升级版本——是一种合适的替代选择

http特性:

1.HTTP 是无连接无状态的

2.HTTP 一般构建于 TCP/IP 协议之上,默认端口号是 80

3.HTTP 可以分为两个部分,即请求和响应。

http请求:

  • HTTP 定义了在与服务器交互的不同方式,最常用的方法有 4 种
    分别是 GET,POST,PUT, DELETE。URL 全称为资源描述符,可以这么认为:一个 URL 地址
    对应着一个网络上的资源,而 HTTP 中的 GET,POST,PUT,DELETE
    就对应着对这个资源的查询,修改,增添,删除4个操作。

  • HTTP 请求由 3 个部分构成,分别是:状态行,请求头(Request Header),请求正文。

  • HTTP 响应由 3 个部分构成,分别是:状态行,响应头(Response Header),响应正文。

  • HTTP 响应中包含一个状态码,用来表示服务器对客户端响应的结果。
    状态码一般由3位构成:

    1xx : 表示请求已经接受了,继续处理。 2xx : 表示请求已经处理掉了。 3xx : 重定向。 4xx : 一般表示客户端有错误,请求无法实现。 5xx : 一般为服务器端的错误。

常见的状态码:

  • 200 OK 客户端请求成功。

  • 301 Moved Permanently 请求永久重定向。

  • 302 Moved Temporarily 请求临时重定向。

  • 304 Not Modified 文件未修改,可以直接使用缓存的文件。

  • 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。

  • 401 Unauthorized 请求未经授权,无法访问。

  • 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因。

  • 404 Not Found 请求的资源不存在,比如输入了错误的URL。

  • 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。

  • 502 Bad Gateway 是一种HTTP协议的服务器端错误状态代码,它表示作为网关或代理角色的服务器,从上游服务器(如tomcat、php-fpm)中接收到的响应是无效的

  • 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

在浏览器地址栏输入URL之后回车的过程

  • URL解析,抽出域名字段

  • DNS解析,域名解析成IP

    • 浏览器缓存->操作系统缓存->路由器缓存->ISP缓存->根域名服务器->主域名服务器
  • TCP/IP连接,三次握手(Three-way Handshake,是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包)

    • 客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里

    • 服务器发回确认包(ACK)应答

    • 客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

  • 发送HTTP请求

  • 服务器处理请求并返回 HTTP 报文

  • 浏览器解析渲染页面

  • 断开连接:TCP 四次挥手

    • 假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据

    • 服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接

    • 服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK

    • 客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态

http与https的区别

  1. https协议需要到ca申请证书,一般免费证书较少,需要付费
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
  3. http默认80端口,https默认443端口
  4. http是无状态连接;https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,安全性更高

缓存 SessionStorage,localStorage,Cookie

存储方式

  • cookie会数据始终在同源http请求中携带,在浏览器和服务器之间来回传递
  • sessionStroage和localStroage仅保存在本地

存储大小

  • 单个cookie不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie
  • sessionStroage和localStroage可以达到5M

过期时间

  • 只在设置的cookie过期时间之前有效,即使窗口关闭或浏览器关闭
  • sessionStorage,仅在当前浏览器窗口关闭之前有效
  • localStorage:始终有效,窗口或浏览器关闭也一直保存,本地存储,因此用作持久数据

作用域

  • cookie和localStorage: 在所有同源窗口中都是共享的.只要浏览器不关闭,数据仍然存在
  • sessionStorage:打开多个相同的URL的Tabs页面,会创建各自的sessionStorage;关闭对应浏览器tab,会清除对应的sessionStorage
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354