美文网首页程序员
webpack,http整理篇

webpack,http整理篇

作者: Taco_King | 来源:发表于2020-06-09 16:56 被阅读0次

    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

    相关文章

      网友评论

        本文标题:webpack,http整理篇

        本文链接:https://www.haomeiwen.com/subject/mkhetktx.html