### 什么是模块化
    -node模块化:遵循了commonJS的规范,一个文件是一个模块。
     nodeJS本身就自带模块化的思想 导入(require)、导出(module.exports)。
     
     -js的模块化:指一个js文件里面引用另一个js文件
     js模块化是由Es6出来时,才提出来的,但是由于浏览器兼容性问题,没有广泛使用开。
     后来一些开发工具的出现才让模块化很方便的使用。导入(import)、导出(export)
     
 ### 为什么要使用模块化    因为模块化可以使我们的代码具有可复用性、高维护性、按需加载
     一个个模块就像是做房子的一块块砖一样
     ## 1. nodeJS中的模块分类
 1. 内置模块:由nodeJS官方提供的,例如fs文件读写模块、path路径模块、http网络请求模块等
 2. 自定义模块:由用户自己创建的js文件,导入的时候需要有相对路径
 3. 第三方模块:由其他个人或公司开发的模块,然后上传到npm网站上的模块,使用前需要先安装。 ## 2. node模块化
    
    node模块化遵循了commonJS的规范,一个文件是一个模块。
    模块导入 -- require
    模块导出 -- module.exports
    
 ```js
     //导出形式 默认值为一个空对象 {}
     module.exports = {
         '需要导出的对象'
         ...
     }
     //另一种导出形式
     exports.a = 2
 ```
 >注意: 导出时,应始终以 module.exprts 导出的对象为准 
 ```js
     //导入形式
     const index = './index'
 ```
 >node里面导入的时候,.js后缀名可以省略 ## 3.npm与包
 第三方模块也叫做“包”
 一些常见的npm命令
 ```js
     //安装包
     npm i 包名 
     npm i 包名1 包名2
     //安装指定版本的包
     npm i 包名@x.x.x
     //快速新建package.json文件
     npm init -y
     //一次安装所有包 可以更新node_module文件夹
     npm i
     //卸载包
     npm uninstall 具体的包名 
     
     //查看当前的下包镜像源
     npm config get registry
     //设置镜像源
     npm config set registry=https://xxx/
 ```
 dependencies节点专门用来记录用npm install命令安装了哪些包
devDependencies节点
如果某些包**只在项目开发阶段**会用到,在**项目上线之后不会用到**,则建议把这些包记录到devDependencies节点中。
与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies节点
 ```js
 //安装指定的包,并记录到devDependencies节点中
 npm i 包名 -D
 npm install 包名 --save-dev
 ```温故而知新:
 1. 改变函数内部this指向的三种方法及区别
    ```
    改变函数内部this指向的三种方法分别是:call()、apply()、bind()
    fun.call(thisArg, arg1, arg2, …)  --call方法会直接调用函数,可以传递多个参数,常用于继承
    fun.apply(thisArg, [argsArray]) --也会直接调用函数,传递的参数要是一个数组,常用于数组
    fun.bind(thisArg, arg1, arg2, …) -- 只改变this指向一般都用bind
    ```
 2. 说出迭代遍历数组,筛选数组,查找数组中是否有满足条件的元素这三种方法
     ```
     forEach()方法、filter()方法、some()
     ```
 3. 说出闭包的定义及作用
     ```
     闭包:一个内部函数使用外部函数的变量,一般存在嵌套关系
     能够延长变量的生命周期,
     ```
 4. 定义变量的几种方式分别是什么?有什么区别?
     ```
     var let const 
     var没有块级作用域,还有声明提升,存在很多缺陷
     let 有块级作用域 
     const 定义常量
     ```
 5. flex布局主轴有哪几种排列方法
     ```
     justify-content: flex-start/flex-end/center/space-between/space-bround
     ```
 6. 浅拷贝和深拷贝的区别
     ```
     浅拷贝只是把地址值复制过去了,一个的值发送变化,另一个也会跟着变化
     深拷贝不仅复制内容,也重新分配了一片内存空间
     ```
 7. 防抖和节流的区别?如何实现防抖和节流?
     ```
       防抖:在一定时间内,频繁触发事件,只有最后一次生效。一定时间内触发事件,会让定时器重置计时。常用于input输入框。
       节流:减少事件的触发频率。常用于scroll、mousemover事件。
     ```
 8. 什么是跨域?跨域有几种解决方法?
     ```
     请求的url的协议、域名、端口号与当前url的有任何一个不同,就发生了跨域
     常见的解决方式有:JSONP、CORS
     ```
 9. 图片懒加载的原理
     ```
     把图片的src属性换成自定义的属性,通过判断页面的scrillTop()方法,动态设置src属性
     ```
 10. 构造函数,原型对象,对象实例之间是怎样查询的?
     ```
         构造函数的显式原型等于原型对象的隐式原型
     ```
 11. 三元表达式的用法是什么?
     ```
     条件判断式?值1 : 值2
     条件为true就是值1
     ```
 12. 在Nodejs中如何拼接路径字符串?
     ```
     path.join(__dirname,'')
     ```