华南理工大学无线电爱好者协会软件小组大前端-万物皆可JS框架学习

React 技术栈心得

2017-03-26  本文已影响2277人  唐紫依

前言

“步入前端两年半,自觉菜鸡懒又烂。” 近来想着写写一些前端学习的心得,左思右想。还是从 React 入笔。为什么是 React?身为小白,React 庞大的技术栈确实给我很多编程思想上的启迪,也让我了解到更多前端领域的知识。时至今日,自己仍在探索 React 的路上。在此,感谢一路上并肩作战的战友和捎带一段车程的司机们。

零、初识 React

刚开始接触 React,大概是去年这个时候。当时 React 在 Github 的 stars 飞升,超过了之前如火中天的 AngularJS 。一开始会觉得 React 通过 jsx 实现 HTML 模板的做法并不比 AngularJS 的模板好用,因为按照传统的前端开发模式,HTML 负责结构层,CSS 负责渲染层,JavaScript 负责行为交互层,这似乎有所违背。但后来对 Virtual DOM 有了进一步的了解,才发现这是 React 的精髓所在。

一、Virtual DOM

Virtual DOM?说到 Virtual DOM 一开始是听说它的性能很高,是啊,渲染性能确实很高,但是只是单纯使用不去思考,那我又能获得什么呢?一个库的使用方法?了解一门前端热门的库?思前想后,我觉得 Virtual DOM 给我的启迪大致有以下两方面:性能优化策略(diff 算法)和 颠覆传统 DOM 编程思想。

1.性能优化策略

  • 在浏览器内存中,维护着一课与页面 DOM 结构一致的对象树
  • Web UI 中 DOM 节点跨层级的移动操作特别少,可以忽略不计

于是,React 基于以上三个前提策略,分别对 Tree diffComponent diffElement diff 进行算法优化,事实也证明这三个前提策略是合理且准确的,它保证了整体界面构建性能。

  • Tree diff:只会对同一父节点下的所有子节点进行比较,当发现节点不存在,则该节点及其子节点会被完全删除掉,不会用于进一步的比较

2.抽象——编程思想的颠覆?

一开始思考 React 跟 Vue 的区别的时候,就只有直观的架构模式 MVC,MVVM 的区别,但是 MVC 只要加个 事件监听数据劫持 不也可以实现 数据双向绑定?当然,后来就想到了 Vue 比较适合中小型项目,而 React 比较适合大型项目。但是,究其根本,似乎没有明确的理由。近来又似乎找到了答案。

二、模块化开发

模块化开发在软件工程里边也算是一个老生长谈的话题了,而在 JavaScript 这门语言中,一直都是通过 <script></script> 标签在 HTML 文档中引入文件,而且模块(文件)间的依赖关系也没有通过很多的方法去处理。或许是前期前端开发的改革注重于新功能的实现,所以很长一段时间都花在浏览器 API 的优化上面了,但是随着前端开发工程化,模块化开发成了一个不可以回避的问题。

1.模块化规范

前端的模块化规范有 AMD 和 CMD(国内提出的),后端的模块化规范有 CommonJS(Nodejs 采用这种规范)。

define(id?, dependencies?, factory);  // id:模块名字; dependcies: 依赖模块字面量; factory: 模块初始化需要执行的函数或对象
define(factory);  
// require 是可以把其他模块导入进来的一个参数
// exports 是可以把模块内的一些属性和方法导出的一个参数
define(function(require, exports, module) {
   // 模块代码
})
// module.exports 就是模块外部与内部通信的桥梁
// 加载模块使用 require 方法,该方法读取一个文件并执行,最后返回文件内部的 module.exports 对象
let i = 1;
let max = 30;

module.exports = function () {
   for(i -= 1; i++ < max; ) {
    console.log(i); 
  }
  max *=1.1;
}

2.React 开发中使用的模块化

import '../welcome.scss'
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}
.welcome{
  h1{
    ...
  }
  p{
    ...
  }
}

// 编译结果
.welcome h1{...}
.welcome p{...}
  • 设置 Common.scss ,定义好全局复用的样式效果(比如字体大小的几款样式,样色,阴影效果,动画效果)

3.包管理工具(npm)和自动化打包工具(webpack)

  • 使用 webpack --watch 命令代替 webpack ,这样在第一次打包之后打包速度会比较快

The webpack-dev-server is a little Node.js Express server, which uses the webpack-dev-middleware to serve a webpack bundle. It also has a little runtime which is connected to the server via Sock.js.

三、React-router

  • 老版本浏览器的 history:主要通过 hash 来实现,对应 createHashHistory

READ MORE

上一篇 下一篇

猜你喜欢

热点阅读