(17.06.02)模块化定义、RequireJs下载/安装、ES6语法翻译成ES5、ES6模块化、ES6常用补充

模块化:
把大系统,较复杂的功能,进行切分。

CommonJs:
    NodeJS
AMD:
    requirejs
CMD:
    seajs

RequireJs:
一、安装、下载
    官网: requirejs.org
    Npm: npm i requirejs
二、使用
    以前的开发方式的问题:
        1)、js 是阻塞加载
        2)、变量名冲突
        3)、多个JS文件之间相互依赖(必须保证一个正确的顺序)

1、简单示例
    require(['js/a1.js']);
        —— 不阻塞页面渲染了
2、定义模块:(AMD) define
    一个模块就是一个JS文件。

    define(function(){
        //....
        return 模块要返回(导出)的东西
    });
3、模块的调用:require
    require([模块1,模块2...],function(mod1,mod2....){
        //所有模块加载完成后要做的事情
    });

4、模块返回值:可以是任何东西
    define(function(){
        return {
            a,
            show(){}
        }
    });
5、在一个模块里可以引入其它模块
    define(['想引入的模块1','想引入的模块2'...],function(mod1,mod2){
        mod1 -> 想引入的模块1
        ...
    });

注意:引入模块的路径,是由html文件决定。

6、路径问题
    /1.html
    /html/2.html
    /js/
        a1.js
        a2.js  (依赖a1.js)
    1) 1.html
        require(['js/a2.js']);
        a2.js :
            define(['a1.js']);  ×
            define(['js/a1.js']) √
    2)2.html
        require(['../js/a2.js']);
        a2.js:
            define(['js/a1.js'])   ×
            define(['../js/a1.js'])  √
        奇怪的事:
            使用  define(['../js/a1.js'])  √
            1.html 能正常使用
7、配置
    1) baseUrl

    require.config({
        baseUrl:  // 用于指定模块的根目录
    });

    /1.thml
        baseUrl: 'js2'
    /html/2.html
        baseUrl:'../js2'

    有baseUrl ,不能加 .js 扩展名
    没有baseUrl,可加可不加

    建议: 使用baseUrl, 不加 .js

    2) paths:
        类似于给某个模块起别名

8、程序主入口
    <script src="require.js" data-main="js/main" ></script>

ES6:
    自己支持模块化。

let
块作用域
const
...:
    ...args —— 用于扩展函数参数
    ?
()=>

?let map = new Map();
map.set
map.get
map.delete

``

?str.startsWith
str.endsWith

数组方法


ES6:
    let a = 12;

    浏览器对ES6的支持不完整。不同的浏览器支持的程度也不同。

    在不支持的情况下,要使用ES6,借助工具 —— 可以把 ES6的语法翻译成ES5或以前的。

    工具:

    1)网页
        http://babeljs.io/repl/

        https://google.github.io/traceur-compiler/demo/repl.html#let%20a%20%20%3D%2012%3B%0A

        用于 测试语法的正确性。
    2)本地环境
    babel
    traceur:
        浏览器端 直接使用 ES6语法,进行翻译的一个较方便的工具:
            traceur.js
            bootstrap.js  —— 和前端布局使用的bootstrap没有任何关系
        <script src="js/traceur.js"></script>
        <script src="js/bootstrap.js"></script>
        <script type="module">

ES6模块化:
    定义(导出):

        1、
            export 定义
            export let a = 12;
            export let b = 5;
            export function show(){}

        2、
        let a = 12;
        export default {
            a
        }
    使用:
        1、import {a,b,show} from 'js/a.js'  //注意名字必须和导出的名字一致

        2、
            import modA from 'js/a.js'  //a.js 扩展名  .js  不能省略

    在模块中引用其它模块:
        a.js
            import modA from './b.js'

node中引模块:
    const express = require('express'); //node_modules
    自己定义的模块,非系统模块的引入:
        const modA = requires('./modules/modA');


ES6常用补充:
    1、 ... 扩展参数 Rest Arguments

        1) function show(a,b,...arg){}
        2) 复制数组:  arr=[...arr2];
            a. 循环赋值
            b. ...
            c. arr2 = Array.from(arr);  //不支持ie

    2、字符串新增

        str.startsWith('字符串1') //判断 str 是否以 字符串1 开头  —— true/false
        str.endsWith('字符串2') //判断 str 是否以 字符串2 结尾 —— true/false

    3、Map

        一种新的数据结构。也是一种 key/value的形式。 键/值 对。
        结构:  []  {} 
        1)  let map = new Map();   // 得到一个Map 对象
        2) 增加一项
            map.set('key',value);
        3) 取一项
            map.get('key');
            //返回 key 对应的value值
            //如果找不到,返回 undefined
        4) 删一项
            map.delete('key');

    4、for ... of

        循环:
            for
            for...in
            while
        循环数组:
            for(let item in arr){
                item -> 数组的每一项
            }
        循环JSON:  不能
        循环Map:
            1) 
                for(let item of map){
                    item[0]  —— key
                    item[1] —— value
                }
                item 是数组
            2) 解构赋值
                for(let [k,v] of map){
                    k —— key
                    v —— value
                }

                [k,v] = item;
            3) for(let item of map.entries()){}  //默认值,如果用 map 和 map.nentries() 效果一样
            4) for(let key of map.keys()){}
            5) for(let val of map.values()){}
        再循环数组:
            1)  for(let item of arr.entries()){}
                item ->  [下标,值]
            2) for(let key of arr.keys()){}
                key ->  数组下标
            3) for(let v of arr.values()){}   ×

    5、箭头函数的简写

        1) 如果函数体只有一句话,并且是return
            —— 可以把  return 和 {} 省略
        2) 如果函数参数只有一个
            —— 可以把 () 省略
            (a)=>{...}
            a=>{...}

    6、数组新方法

        数组方法:  push  pop shift unshift splice sort concat reverse join 
            indexOf
        ES6新增:
            1) map  —— 映射
                对数组中的每一项做相同的操作——产生一个新数组
                let arr2 = arr.map(function(item){
                    //alert(item);
                    return item + 1;
                });
                arr2 ——> arr 的每一项加1的结果
            2) forEach —— 循环
                arr.forEach(function(val,index){
                    val ——> 数组每一项的值
                    index ——> 数组的下标
                });
            3) filter —— 过滤
                let arr2 = arr.filter(function(item){
                    return item > 5;   // 条件: true /false
                });
                arr2 ——> arr中值 大于5的
            4) reduce —— 汇总
                a.
                    arr.reduce(function(前一个,当前,索引,自己){
                        前一个:第一次 是  第一个数
                            以后  是 undefined
                    });
                b.
                    arr.reduce(function(前一个,当前,索引,自己){
                        return xxx;  //xxx 就是下一次的 前一个
                    });
                c.
                    arr.reduce(function(pre,cue,index,self){},前一个);

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

推荐阅读更多精彩内容