# API

# IntersectionObserver API

平时的业务中经常有,判断dom出现在视口的做一些效果或者打点的需求。

实现方案

  • 1 通过在scroll事件中监听dom距离视口的距离
  • 2 通过IntersectionObserver观测
const dom = document.getElementById('id');
//scroll执行频率过高,浪费性能
window.onScroll = function (){
    const elementIsInView = elementIsInViewport(dom);
}
//
function elementIsInViewport(e){
    if(!e) return false;
    //获取元素四边距离视口的距离
    let {top,left,bottom,right} = e.getBoundingClientReact();
    return (
        top>=0 
        && left>=0 
        && bottom <=(window.innerHeight || document.documentElement.clientHeight)
        && right <=(window.innerWidth || document.documentElement.clientWidth)
    )
}
    var container = document.getElementById("container")
    let io = new IntersectionObserver((entries,observer)=>{
    console.log(entries[0].isIntersecting);//元素进入可实区域
    });
    //观测dom
    io.observe(container);
    //取消观测
    io.unobserve(container);

# 模块化部分

  • CommonJS
  • AMD
  • CMD
  • UMD
  • ES6

# CommonJS

commonJS主要应用在nodejs中,主要通过四个变量module.exports、exports、glabal和require。

  • 每个文件就是一个模块,每个模块都有独立的作用域,内部所有变量、函数对其它模块都是不可见的
  • 可以通过module.exports或者exports对模块进行导出, module代表当前模块
  • 可以在另一个文件中通过require进行导入 -每个模块可以多次加载但是只会在第一次加载时运行,然后会被缓存供后续加载时使用(主要通过module中的一个字段来控制)

# AMD

AMD 推崇依赖前置。 AMD | 速度快 | 会浪费资源 | 预先加载所有的依赖,直到使用的时候才执行。 AMD的出现主要是为了解决前端模块化的问题,(CommonJS不支持浏览器)。 AMD并不能直接跑到浏览器,实现的工具(requireJS).

//定义模块
define('moduleA',function(){
    let a = [1,2,3,4,5];
    return{
        a : a.reverse();
    }
});

//使用
require('moduleA',function(moduleA){
    console.log(moduleA.a);
})

//配置模块路径

require.config({
    paths:{
        moduleA:'./js/moduleA'
    }
})

# CMD

  • CMD 推崇依赖就近。 CMD | 只有真正需要才加载依赖 | 性能较差 | 直到使用的时候才定义依赖
  • SeaJS 在推广过程中对模块定义的规范化产出。

# UMD

  • 1.先判断是否支持Node.js模块格式(exports是否存在),存在则使用Node.js模块格式。
  • 2.再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
  • 3.前两个都不存在,则将模块公开到全局(window或global)。-