前端知识,温故知新

(一) Web 技术演变

  1. 静态页面阶段

    • 页面以HTML文件的形式存储于服务器中,浏览器请求直接返回该HTML文件。
  2. 动态页面阶段

    • ASP (C#)
    • JSP (Java)
    • PHP
    • 后端渲染过程
  3. 动态页面(MVC)阶段

    • SpringMVC (IoC、OOM)
    • Controller、Model、View
    • 数据层关系映射
  4. Ajax、jQuery 成为 Web 2.0的基础

    • 异步请求、局部刷新
    • JS操作DOM元素
  5. React、AngularJS

    • SPA (Single Page Application)
    • 组件化 (典型 React.js )
    • 数据绑定 (MVVM, Model-View-View-Model,典型 AngularJS)
    • 前后端分离
    • 自动化测试、脚手架等(gulp,bower,grunt,webpack,babel...)
    • 驱动开发
  6. Node.js

    • 打破JS在浏览器环境下的限制, V8的性能将JavaScript带到了一个新的高度、JS无所不能
    • 涉足广泛:
      • Web端 (React.jsAngularJSAngularJS 2backbone.jsvue.js)
      • 移动端 (Ionic <with Angular>React Native<with React.js>Weex<with vue.js>)
      • 服务器端 (Node.jsExpress.js)
      • 桌面端 NW.js, electron
      • 全面覆盖解决方案(Meteor.js)
      • 其他
        • 游戏(WebGL)、AR、VR、物联网、硬件、操作系统(OS.js
  7. Atwood's Law

    Any application that can be written in JavaScript, will eventually be written in JavaScript.

  8. 参考资料:

    1. http://blog.csdn.net/zzzkk2009/article/details/9849431
    2. http://blog.jobbole.com/45170/

(二) JavaScript

  1. JavaScript 语言的发展历程

    ECMAScript 和 JavaScript 之间,前者是后者的标准,后者是前者的实现;

    • 网景公司、微软浏览器之争,JavaScript胜出
    • 1997 -> ECMAScript 1.0
    • 1998 -> ECMAScript 2.0
    • 1999 -> ECMAScript 3.0 (成为JavaScript的通行标准,得到了广泛支持)
    • 2007 -> ECMAScript 4.0
    • 2008 -> ECMAScript 5.0
    • 2011 -> ECMAScript 5.1 (成为ISO国际标准)
    • 2015 -> ECMAScript 6.0 (ECMAScript 2015)
    • 2016 -> ECMAScript 7.0 (ECMAScript 2016)
    • ...

    ECMAScript现在每年发布一个新版规范,ECMAScript 2017已在制定之中

  2. 特点

    • 基于原型的、直译式的、弱类型的、动态类型的脚本语言
  3. 语言本身

    • 实际上JavaScript是由ECMAScriptDOMBOM三者组成的

      • DOM -> Document Object Model(Map)
      • BOM -> Browser Object Model(Map) / Window Object Model
    • 严格模式(使用"use strict"声明)

      function somefunction(){
          "use strict"
          //...
      }
      
    • 语句结尾分号

    • 数据类型

      • 基本数据类型:null、undefined、bool、number、string

      • 复杂数据类型:object

        • constructor
        • hasOwnProperty
        • isPrototypOf
        • prototypeIsEnumerable
        • toLocaleString
        • toString
        • valueOf
      • typeof 操作符

      typeof null == "object" // true
      null == undefined // true
      
      • 计算问题
        • 浮点数计算问题
        0.1 + 0.2 == 0.3 //false
        
        • Infinity、-Infinity
        • NaN (Not a Number)
        • 不同类型的比较或者转换,依次调用valueOf,toString
      • 位移操作
        • 有符号(>><<)
        • 无符号(>>>,<<<)
      • 逻辑操作符(短路作用)
      • 关系操作符
        • == 强制类型转换后,再进行比较
        • === 直接比较
        "55" == 55 // ture
        NaN != NaN // true
        null == undefined // true
        
        "55" === 55  // false
        null === undefined // false
        
      • 基本的语句
        • label with
    • 函数

      • 定义方式
      // 声明方式 1
      var func1 = function(){
          console.log("Hello World");
      };
      // 声明方式 2
      function func2 (){
          console.log("Hello World");
      }
      // 调用
      func1();
      func2();
      
      // 匿名函数、直接运行
      (function(num){
          console.log(num+1);
      })(1);
      
      • 参数
        • 不限制传递的参数的多少
        • arguments对象(类似数组,与数组的区别)
        • 函数不能重载,后定义函数会覆盖前面定义的
    • this 对象

      • 指向当前运行的对象,动态指向
      • call(this,arg1,arg2,...), apply(this,[arg1,arg2,arg3,...])
      • bind() 新语法特性
    • 闭包、封装

      function outer(){
          var in = 123; // 局部变量,函数调用结束后可以被释放
          return in;
      }
      outer(); // 123;
      /* JavaScript 中, 函数也是一个对象,若以函数的形式返回*/
      function outer(){
          var in = 123;    
          return function(){
              return in; 
          }
      }
      var func = outer();
      func(); // 123;
      
    • 对象及原型链

    • JSON数据结构

      var jsonObj = {
          name : "value"
      }
      
    • 浏览器对象(BOM操作)

    • 文本对象(DOM操作)

      • 树形结构
        • 根节点、元素节点、文本节点、属性节点
      • DOM操作
      // 获取元素
      var element = getElementById("name");
      var element = getElementsByTagName("name");
      var element = getElementsByClassName("name");
      // 获取/设置元素属性
      element.getAttribute(“title”)
      element.setAttribute(attribute,param)
      // 节点操作
      parentNode.childNodes()
      node.nodeType(元素节点、文本节点、属性节点)
      node.nodeValue
      parentNode.lastChild
      parentNode.firstChild
      // 创建、插入节点
      var element = createElement();
      parentNode.appenChild(element)
      parentNode.insertBefore(element);
      
      • 工具库
        • jQuery
        //简单灵活的选择器,简化属性操作
        var value = $("#id").attr('name');
        $("#id").attr('name','newName');
        
        • prototype.js
    • 异步请求 Ajax、Promise对象

      • XMLHttpRequest对象
  4. 参考资料:

    1. http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/
    2. http://www.w3school.com.cn/js/

(三) React.js

  1. 背景:

    • 网页加载流程
      1. 转换IP地址 域名(网址)到IP地址的转换,依次从浏览器缓存、操作系统host文件、网络运营商、域名查询服务器
      2. 建立连接 三次握手、TCP协议
      3. 发送请求
      4. 接受请求
      5. 返回数据 MVC
      6. 解析html文档、渲染页面 网络上得到HTML的相应字节时,DOM树就开始构建;DOM树到渲染树
      7. 加载资源 js文件、css、图片、字体
      8. 执行JavaScript脚本
        (JS渲染过程)
  2. 主要内容

    • 虚拟DOM
    • 组件化
    • JSX语法
    • 编写component
      • 属性(this.props)
      • 状态(this.state)
      • 生命周期
        • 三种状态
          • Mounting:已插入真实 DOM
          • Updating:正在被重新渲染
          • Unmounting:已移出真实 DOM
        • 五种处理函数:
          • componentWillMount()
          • componentDidMount()
          • componentWillUpdate(object nextProps, object nextState)
          • componentDidUpdate(object prevProps, object prevState)
          • componentWillUnmount()
        • 两种特殊处理函数
          • componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用
          • shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用
  3. 参考资料

    1. http://www.cocoachina.com/webapp/20150721/12692.html
    2. https://github.com/tsrot/study-notes/blob/master/React%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB.md
    3. http://wiki.jikexueyuan.com/project/react/

(四) React Native

  1. 理念:

    Learn Once Write Anywhere

    • Web iOS Android
    • Virtual DOM
    • React(JS/JSX)
  2. 使用情况

    • FaceBook
    • 腾讯
    • 百度
    • 京东
  3. 优缺点

    • 优点:
      1. 不使用WebView,性能提升;
      2. 热更新;
      3. 组件化,可复用;
      4. 布局灵活
    • 缺点:
      1. 学习成本偏高(大量前端的知识);
      2. react-native 官方版本不稳定,更新周期约2个星期一版;
      3. iOS和Android不能共用一套代码;(官方组件还是区分iOS版本和Android版本)
      4. 性能有待提升
  4. 学习地图

    • 工具的使用, Node, NPM, react-native-cli, git, IDE使用
    • 前端知识,(Javascript,Html,CSS)
    • ES5 及 ES6 新特性
    • React.js
    • JSX语法、Flexbox布局
    • 第三方组件
  5. 环境搭建

    参考 http://reactnative.cn/docs/0.40/getting-started.html

    • 安装 Node.js (npm)
    • 安装 React Native的命令行工具(react-native-cli)
    • 安装 Android Studio
    • 安装 Watchman
    • 安装 其他

    • IDE:Nuclide,VSCode,WebStorm
    • 特别注意网络环境问题
  6. 项目结构

    • package.json // 项目配置的说明

      {
          "name": "WithReactNative",
          "version": "0.0.1",
          "private": true,
          "scripts": {
              "start": "node node_modules/react-native/local-cli/cli.js start",
              "test": "jest"
          },
          "dependencies": {
              "flow-bin": "^0.39.0",
              "react": "^15.4.2",
              "react-native": "0.40.0"
          },
          "jest": {
              "preset": "jest-react-native"
          },
          "devDependencies": {
              "babel-jest": "17.0.2",
              "babel-preset-react-native": "1.9.0",
          }
      }
      
    • node_modules // 第三方依赖

      根据package.json里的描述,将依赖包下载到该文件夹下管理

    • .babelrc //babel.js的配置文档,用于将ES6语法转为ES5

      http://babeljs.cn/docs/usage/babelrc/

    • .flowconfig // Flow 工具配置文件

      Flow是一个用于静态类型检查的JavaScript的开发库。Flow依赖于类型推导来检测代码中可能的类型错误,并且允许逐步向现存的项目中添加类型声明。如果需要使用Flow,只需要用如下的命令:flow check
      *

  7. 与Native的交互、通信

  8. 组件使用

    • 编写自定义组件

      //组件一般性模板(ES6规范)
      import React, { Component } from 'react'; // 引入react相关的组件
      import {
          StyleSheet,
          View,
          Text
      } from 'react-native'; // 引入react-native相关的组件
      
      // 定义组件,继承Component类
      export default class TplView extends Component {
      
          static defaultProps = {
              // 默认属性  
          };
      
          static propTypes = {
              // 组件属性的类型要求
          };
          
          //构造函数
          constructor(props) {
              super(props);
              this.state = {
                  //TODO
              };
          }
      
          componentWillMout(){
              // 组件将要加载时的处理函数
          }
      
          render() {
              //渲染函数
              return (
                  <Text> Hello World </Text>
              );
          }
      
          componentDidMount() {
              // 组件已经加载到界面上
          }
      
      }
      // 定义样式
      const styles = StyleSheet.create({ 
      
      })
      
    • prop 和 state

      • prop
        保存组件的调用者传入的数据
      • state
        组件记录组件内部的自定义状态变量

      通过setState()方法触执行render函数以更新视图

    • Flex 布局(弹性布局)

      • flex

        • 定义组件间权重
      • flexDirection

        • row、column两个值,定义主轴方向
      • alignItems

        • 子组件在垂直方向上的对齐方式
        • flex-start、flex-end、center、stretch
      • justifyContent

        • 子组件在水平方向上的对齐方式
        • flex-start、flex-end、center、space-between、space-around

      参考 http://www.runoob.com/cssref/css3-pr-align-items.html

    • 原生组件、API使用

      见官网

    • 第三方组件

  9. 网络请求-fetch

    // fetch(url,{option}).then().then()
    fetch(
        requestUrl,
        {
            method:method,
            headers:{
                'Accept' : 'application/json; charset=utf-8'
            }
        })
        .then((responseData)=>{
            if (responseData.status < 400 ){
                return responseData.json(); 
            }
            else{
                throw new Error(responseData.message,responseData.status);
            }
        })
        .then(function(json){
            console.log(json);
        });
    
    
  10. 自定义Native层组件和模块

    • 自定义Native层组件向Javascript层暴露使用
    • 自定义Native层接口函数
  11. 场景路由管理等

    • navigator
    • react-native-router-flux
  12. 真机调试

    • 确保手机与开发环境(笔记本)在同一wifi下
    cd project                 //进入到项目根目录
    react-native run-android   //编译并运行 
    
    • 开启悬浮窗权限
    • dev工具菜单 (摇一摇)
      • Reload // 触发下载刷新代码
      • Debug JS Romotely // 在Chrome里查看console.log等内容,配合Chrome里的
      • Enable Live Reload // 自动重载
      • Enable Hot Reloading // 监控更多内容,如新建文件
      • Show Perf Monitor // 显示界面帧率
      • Dev Settings // 设置开启debug,最小化js文件,链接服务器的地址
    • 黄色警告
    • 红色错误
  13. 性能优化

    • setNativeProp
    • 分包
    • 删除so、集成的类库
  14. 发布生产过程

    • 编译,打包
    • Native层控制
    • JS版本发布服务器
    • 相应的管理平台等
    • 灰度发布等
    • 第三方服务 Microsoft CodePush

(五) Weex

Coming Soon

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

推荐阅读更多精彩内容