/react-note

Primary LanguageJavaScript

一,git基本操作

回顾一下git的基本知识

  1. 全局设置git用户名 git config --global user.name "username"
  2. 全局设置git邮箱 git config --global user.email "email"

二,babel

bable预设

  1. babel安装

    sudo npm install babel-cli -g

  2. babel基本操作

    单文件操作

    babel test.js(要编译的文件名.js) —out-file output.js(编译后想要的文件名);

    编译整个文件夹

    babel src --out-dir dist,简写babel src -d dist;

    -w 监听变化

    使用方法babel src -d dist -w

    工程中使用的话

    使用npm i babel-cli --save-dev,使当前的项目依赖babel

     (1) 安装过后提供了babel-node命令
     (2) 可以通过babel-node 直接运行某个js文件;
    
  3. babel开发 babel与npm的集成

    可以通过设置package来简化命令行操作,build : babel src -d dist

  4. loose

    loose模式是将es6转换成es3,向下兼容,es3再想转换成es6就有难度了。

    normal模式则是将es6转换成es5,转换之后的es5语法用于es6,以及native开发都会方便很多。

babel plugins

  1. 在.babelrc中添加“plugins”:["插件名"],
  2. npm i plugins,使用的时候在.babelrc中添加即可

babel解析react jsx语法

  1. babel-preset-react
  2. 设置预设react
  3. 开始演出

三,es6

1.项目搭建

基本项目目录结构说明
  1. src es6源代码
  2. dist es6->es5可运行代码
  3. index.html 加载dist目录下的代码,测试
  4. 如何开发 npm run dev

2. 箭头函数

2.1. 无函数体箭头函数

2.1.1. 无参数 var fn = ()=>"无参数箭头函数";

上面的例子,()表示参数位置,无参数则()中没有内容,=>直接跟返回值,可以是字符串,也可以是表达式

2.1.2. 有参数箭头函数

(1).唯一参数

var fn = p => p
上面的例子,第一个p为唯一参数,第二个p为返回值。

(2). 多个参数

var fn = (a,b) => a+b;
上面的例子,第一个()中可以写入多个参数,=>后面则是返回值,可以写表达式;
2.2. 有函数体箭头函数
var fn = (a)=>{
  var m = a+3;
  return m;
}
{}表示函数体,如果需要用到函数体,并且需要返回值,那么就要显式的书写return
2.3. 注:箭头函数中的this共享父作用域的关键字this;

3.类

3.1. 通过class创建类,内部通过constructor来定义内部属性,通过直接书写方法,定义prototype上的公共方法

class Animal {
  constructor(name,age){
    this.name = name;
    this.age = age;
  }
  getMessage(){
    console.log(this.name + 'is' + this.age);
  }
}

3.2. 类的继承,通过super

3.3. static,是类的静态方法,可以理解为对象的工具方法,不是实例上的属性,而是类上面的属性,想要调用直接通过类来使用。

3.4. 对象字面量

(1). 以往对象中的方法,例如
    {
      getName : function(){
        console.log("test")
      }
    }
    es6增强后,
    可以写成
    {
      getName(){
        console.log("test")
        //不需要再书写键值
      }
    }

(2). 增强后的proto,可以通过再对象中,直接书写__proto__:others,来快捷的改写对象原型
  var obj = {
    __proto__:others,
  }

(3). 简化了定义属性的写法,可以直接通过书写属性名的方式,来定义属性。
  var a = 1
  var b = "2"
  var fn = (m,n)=>console.log(m+n)
  var obj = {a,b,fn};极大的优化了代码可读性

3.5. 解构赋值

(1) 数组的解构赋值 var [dog] = ["dog","cat"]
(2)对象的解构赋值
var obj = {a:1,fn:function(){console.log(1)}}
var {a,fn} = obj;

3.6. 函数的扩展

(1) 默认值 function(name = "guo",age = "19"),如果参数没有传入,则使用默认参数
(2) 任意参数rest function(obj,...keys){},其中key是剩余参数的所有
(3) 扩展操作 var arr = [1,2,3,4] console.log(Math.max(...arr));
复制 var newarr = [...arr]

3.7. let和const

(1)let局部作用域有效
(2) const定义常量

3.8. 模块

(1) export default 拿不到问题,用babel插件解决
(2) import 重命名
  疑问: 1. exprot,module.exports,exports,export default之间都有什么关系。

3.9 exports 和 module.exports 的区别

对于每一个可执行脚本(js文件),node都会进行模块化
(function(){
    exports = module.exports = {};
    return module.exports;
})()

从上面我们可以看出

1. 所有脚本导出的都是对象
2. 当其他文件引用当前脚本时,拿到的是module.exports;
3. exports 实际上是module.exports的引用;

如何使用:
(1)exports:
    exports.a = 1;
    exports.fn = function(){
        console.log("this is fn")
    }
(2)module.exports:
    module.exports.a = 1;
    module.exports.fn = function(){
        console.log("this is fn")
    }
注意:
(1)
    exports.b = 1;
    module.exports = {
        a = 1
    }
    如上,导出的内容将没有b;
(2)
    exports = {
        b : 1
    };
    module.exports.a = 1;
    如上,导出的内容将没有b;
(3)
    如果想要导出一个对象呢?

    使用exports.obj = {};
    在引用的时候:
    var o = require("./obj");
    取用的话,需要o.obj才能拿到想要的;

    如何才能直接拿到obj呢?
    exports = {}?
    这样做没有任何意义,因为暴露的是module.exports;

    答案:module.exports = {
        a : 1
    }

    因为node最终暴露的是module.exports,所以改写module才是正确的方案;

总结:exports是module.exports的快捷方式,exports主要是用暴露一个个属性,而module.exports则是用来暴露一个类,一个对象。

3.10 es6中的export和import

(1)export命令,向外面暴露的是一个对象;

    输出一个变量:
    export var name = "guo",向外输出一个变量

    输出多个变量:
    export {name,age}

(2)import命令,用来引用一个对象;

    解构赋值提取引用:
    import {name, age} from './test.js'

    拿到暴露的模块对象:
        (1)import * as test form './test.js';
         上面代码的意思是,拿到暴露的所有内容,重命名为test对象。

        (2) module test from 'test.js'
         以指令的方式获取整个暴露对象;

(3)export default

    使用方法:
    export default function getAge() {}

    1. 每一个js文件只能使用一次export default;
    2. import的时候可以随意重命名;
    3. import的时候不再需要花括号;

    总结:通过export defaul会将输出的内容变成一个default变量,可以随意重命名,而且不需要从对象中提取,导入时候不再需要花括号。

    注:一条import 语句可以同时导入默认方法和其它变量:
    import defaultMethod, { otherMethod } from 'xxx.js';

四,webpack

4.1 webpack介绍

官网webpack.github.io

4.2. 基本命令

1. npm i webpack --save-dev
2. 根目录下创建webpack.config.js文件

var path = require('path');
var webpack = require('webpack');
var config = {
    //配置入口
  entry : path.resolve(__dirname,"./src/index.js"),
    //配置输出
  output : {
    path:path.resolve(__dirname,"./dist"),
    filename:"bundle.js"
  }
}
//把配置文件暴露出去;
module.exports = config;

3. npm script 中添加命令build:webpack --progress --colors

4.3. es6

1. 创建.babelrc文件
2. 安装 npm i babel-loader babel-core babel-preset-es2015
3. 配置.babelrc文件
{
    "preset":["es2015"]
}
4.webpack.config.js中配置module
var config = {
  entry : path.resolve(__dirname,"./src/index.js"),
  output : {
    path:path.resolve(__dirname,"./dist"),
    filename:"bundle.js"
  },
  //这里配置了loaders
  module:{
    loaders:[
      {
        test:/\.js$/,
        loader:'babel-loader',
        //exclude是用来声明哪些文件不需要babel-loader进行处理
        exclude:/node_modules/
      }
    ]
  }
}

4.4. 自动产出html

1. 安装插件
npm i html-webpack-plugin --save-dev

2. 在webpack.config.js中进行引入和配置
var htmlWebpackPlugin = require('html-webpack-plugin');

3. 在config中添加配置
plugins:[
    new htmlWebpackPlugin({
        title:'搭建前端工作流',
        template : './src/index.html',
    })
]

4.5 启动本地服务

webpack-dev-server是基于express的微型服务

1. 安装
npm i webpack-dev-server --save-dev

2. 配置npm script
"dev" : "webpack-dev-server --progress --port 8080 --content-base dist --hot"
其中:
"--progress" : 显示进度
"--port" : 设置端口 8080
"--content-base" : 设置启动跟节点
"--hot" : 热更新

3. 端口占用问题
通过lsof -i:8080,查看进程,list open files(列出当前系统打开文件)
查看到进程的pid后
通过kill -9 pid来结束进程

4.除了命令行以外,还可以通过设置webpack.config.js
    (1)配置npm script
         "dev" : "webpack-dev-server --progress"
    (2)在webpack.config.js文件中配置
    ...
    devServer:{
        contentBase:"dist",//设置启动节点
        inline:true,//设置改变自动刷新
        port:8080,//设置端口
        stats:{
            colors:true
        }
    }

4.6 在webpack中加载css

1. 安装
npm i  npm i style-loader css-loader --save-dev

其中:
"css-loader" :会遍历css文件,找到所有的url(...)并且处理。
"style-loader" :会把所有的样式插入到页面的一个style中。

2. 注意,import默认找的是index.js,所以如果引用一个组件,组件中又index.js的话,可以直接引用它的目录。

3. loader得目的:
上述样式loader的目的是,将样式整合进js文件;
最后通过<style>css</style>将样式插入到页面。

4,使用前需要配置:
{
    test:/\.less$/,
    loader:['style-loader','css-loader','less-loader'],
    include:path.resolve(__dirname,"src")
}
上述内容是匹配less文件;
如果匹配,则先执行less-loader,将less变成css;
然后执行css-loader分析css中的background;
最后执行style-loader将样式插入到一个style标签中。
5,文件中引用:
import 'css path'即可