4.webpack&常见概念

原文链接:https://github.com/helloyoucan/knowledge

webpack

1、优化
打包体积优化
  1. 提取第三方库或通过引用外部文件的方式引入第三方库(externals)
  2. 使用压缩插件ParallelUglifyPlugin
  3. 按需加载资源文件require.ensure()import()
  4. 单独打包css文件(ExtractTextPlugin
  5. 去除不必要的插件,开发环境和生产环境单独使用配置文件
  6. 优化devtool中的source-map
  7. 服务器启用gzip压缩
  8. 动态链接库(DllPlugin),单独编译一些不经常改变的代码,比如node_modules的第三方库
打包效率
  1. 开发环境使用增量构建(CommonsChunkPlugin+chunkhash+manifest+webpack-md5-hash),启用热更新
  2. 开发环境不做无意义的工作如提取css计算文件hash等
  3. 选择合适的loader
  4. 个别loader开启cache 如babel-loader
  5. 第三方库采用引入方式替代
  6. 提取公共代码
  7. 优化构建时的搜索路径,指明需要构建目录及不需要构建的目录,减小文件搜索范围
  8. 模块化引入需要的部分
  9. 使用支持多线程构建的loader或插件,并行编译
2、Loader

loader就是一个node模块,它输出了一个函数。当某种资源需要用这个loader转换时,这个函数会被调用。并且,这个函数可以通过提供给它的this上下文访问Loader API。

编写一个loader

// 定义
module.exports = function(src) {
  //src是原文件内容(abcde),下面对内容进行处理,这里是反转
  var result = src.split('').reverse().join(''); 
  //返回JavaScript源码,必须是String或者Buffer
  return `module.exports = '${result}'`;
}
// 使用
{
    test: /\.txt$/,
    use: [
        {
             loader: path.resolve('./path/reverse-txt-loader')
        }
    ]
}
3、热更新原理
  1. 当修改了一个或多个文件时
  2. 文件系统接收更改并通知webpack
  3. webpack重新编译构建一个或多个模块,并通知HMR服务器进行更新
  4. HMR Server使用webscoket通知HMR runtime 需要更新,HMP运行通过HTTP请求更新jsonp
  5. HMR运行时替换更新中的模块,如果确定这些模块无法更新,则触发整个页面刷新

Flux

核心逻辑:数据和逻辑单向流动。

  • dispatcher(调度程序)
  • stores(存储)
  • views (视图)

缺点:Flux冗余的代码多,每个应用中需要手动创建dispatcher实例,在一个应用中含有多个store。

<img src="/images/flux.png" style="width:500px;"/>

Redux vs Flux
Redux Flux
store 各个store合成一个 多个store
更新store 在reducer中 在store中
Dispatcher 没有Dispatcher,使用reducer纯函数处理事件, 使用Dispatcher调度事件

MVC

将业务数据(model)与用户界面(view)隔离,用控制器(controller)管理逻辑和用户输入

  • Model # 保存应用数据,与后端交互或同步数据,校验数据。与业务数据相关,与应用内交互状态无关
  • View # Model的可视化,表示当前状态的视图。前端view负责构建和维护DOM元素
  • Controller # 链接view和model,model的变化会应用到view中,view的操作会通过controller应用到model中
缺点

项目越大,逻辑越复杂,导致数据流动方式混乱。

<img src="/images/mvc.png" style="width:500px;"/>

MVVM

<img src="/images/mvvm.png"/>

NPM

1. npm模块安装机制
  • 发出npm install 命令
  • 查询node_modules目录中是否已经存在指定模块
    • 若存在,不重新安装
    • 若不存在
      • npm 向registry(注册表)查询模块压缩包的网址
      • 下载压缩包,存放在根目录的.npm目录里
      • 解压压缩包到当前目录的node_modules目录
2.npm实现原理
  1. 执行工程自身preinstall(若有的话)
  2. 确定首层依赖模块
  3. 获取模块
  4. 模块扁平化(dedupe)
  5. 安装模块
  6. 执行工程自身声明周期

模块化进程

  1. IIFE(立即调用函数表达式)

    使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免变量冲突

    (function(){
      return {
     
      }
    })()
    
  1. AMD

    使用requireJS 来编写模块化,特点:依赖必须提前声明好

    define('./index.js',function(code){
     // code 就是index.js 返回的内容
    })
    
  2. CMD

    使用seaJS 来编写模块化,特点:支持动态引入依赖文件

    define(function(require, exports, module) {  
      var indexCode = require('./index.js');
    });
    
  3. CommonJS

    nodejs 中自带的模块化。

    module.exports={
    
    }
    var fs = require('fs');
    
  4. webpack(require.ensure)

    webpack 2.x 版本中的代码分割。

  5. ES Modules

    export default{}
    import a from 'a';
    

Token

  • token和cookie都是首次登陆时,由服务器下发,充当交互时进行验证的功能,作用都是为无状态的HTTP提供的持久机制。
  • token存储地方无限制
  • 对于token,服务器不需要保存会话,当用户logout时cookie和服务器的session都会注销,但token只是注销浏览器信息

特点

  • 无状态、可扩展(服务器不存储会话,分布式)
  • 支持移动设备
  • 跨程序调用
  • 安全(防止CSRF)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容