react-native--10Babel语法

在写react native过程中会遇到一些生疏的语法,这里做一个持续更新的记录.

如何在命令行中运行babel代码?

准备工作
# 创建目录
$ mkdir babelpra

# 初始化项目配置(生成一个package.json)
$ cd babelpra
$ npm init    # 根据提示填写配置

# 安装babel脚手架
$ npm install --save-dev babel-cli

# 指定支持编译哪些语法
$ npm install babel-preset-env babel-preset-react --save-dev

# 声明支持默认的babel、es2015、react jsx语法
$ vim .babelrc
{
  "presets": ["env", "es2015", "react"]
}
编写代码
# 编写一个hello world.
$ mkdir src
$ vim src/class_hello.js
class Apps {
  show() {
    console.log('hello world!');
  }
}

let apps = new Apps;
apps.show();
编译和运行代码
# 将es2015代码编译成原始js代码.
$ ./node_modules/.bin/babel src -d lib

# 运行代码.
$ node lib/class_hello.js
hello world!            # 输出结果.

 
 

模块导入的两种形式

第一种: import xx from 'yy';
第二种: import { xx } from 'yy';
刚开始接触时会有点懵逼, 这里特意尝试去感受它们的区别.

不带花括号(第一种)

声明一个模块(注意事项)
export default == module.exports
export default 适用于类对象
module.exports 适用于变量对象
一个文件内只允许有一个export default, 多个export default会报错.
一个文件内如果既定义了export default 又定义了 module.exports, 那么会以module.exports为准, 也就是说module.exports的优先级要高于export defaults.

$ vim moduleNoBrace.js
module.exports = () => {console.log('debug: B')};

export default class A {
    constructor(props) {
        super(props)
        console.log('debug: A');
    }
}


对应导入(注意事项)
不带花括号的导入是指,导入的对象的变量名可以随便定义。

$ vim importNoBrace.js
import HelloWorld from './moduleNoBrace';
new HelloWorld();

编译和运行

$ ./node_modules/.bin/babel src -d lib
$ node lib/importNoBrace.js
debug: B

 

带花括号(第二种)

声明一个模块

$ vim src/modulebrace.js
export class A {
    show() {
        console.log('debug: A');
    }
}

export const B = () => {console.log('debug: B')};

export const C = 'debug: C';

对应的导入

$ vim src/importbrace.js
import {A, B, C} from './modulebrace';
let a = new A;
a.show();
B();
console.log(C);

编译和运行

# 编译
$ ./node_modules/.bin/babel src -d lib

# 运行和输出
$ node lib/importbrace.js
debug: A
debug: B
debug: C

 
 

对象属性提取

声明一个模块

$ vim obj.js
module.exports = {
    name: 'zt',
    gender: 'male',
}

对应导入

$ vim src/importobj.js 
import Hello from './obj';

let { name } = Hello;   // 这里是本案例重点
console.log(name);
console.log(Hello.name);
console.log(Hello.gender);

编译和运行

$ ./node_modules/.bin/babel src -d lib
$ node lib/importobj.js 
zt
zt
male

 
 

对象扩展

变量在创建时,可以引入其他已存在变量,这种引入并非“嵌套”;而是以扩展形式存在,先来看一个简单案例:

const va = {a: 'a', b: 'b', c: 'c'};  
const vb = {x: 'x', y: 'y', ...va};  
console.log(vb);  
输出结果:  
{x: 'x', y: 'y', a: 'a', b: 'b', c: 'c'}; 
准备环境

es2015尚不支持这种写法,未来es2018可能会支持这种写法; 但是这种风格的代码充斥在react-native的源码里,因此我也把它记录下来;
让es2015支持它的唯一途径就是增加plugin

# 安装插件
$ npm install --save-dev babel-plugin-transform-object-rest-spread

# 编辑.babelrc
$ vim .babelrc
{
  "presets": ["env"],
  "plugins": ["transform-object-rest-spread"]
}

编写代码

$ vim src/spread.js
const va = {a: 'a', b: 'b', c: 'c'};  
const vb = {x: 'x', y: 'y', ...va};  
console.log(vb);  

编译和运行

$ ./node_modules/.bin/babel src -d lib
$ node lib/spread.js
{ x: 'x', y: 'y', a: 'a', b: 'b', c: 'c' }    # 输出结果.

 
 

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,087评论 19 139
  • 以下内容是我在学习和研究ES6时,对ES6的特性、重点和注意事项的提取、精练和总结,可以做为ES6特性的字典;在本...
    科研者阅读 3,171评论 2 9
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 3,672评论 2 27
  • 销售员,简单的三个字,却是这社会上最艰难的工作。 马云曾说过,如果你真想锻炼自己,那就去做销售吧! 如果你连销售都...
    突破就是不断的折腾阅读 101评论 0 0
  • A:what do you have there?Max,please show me what you have...
    寻觅一路阅读 675评论 0 0