秋招总结篇——前端模块化

91 阅读2分钟

前端模块化规则,一般来说就是,commonJS(常用于nodejs),esModule(现在前端普遍采用这种),还有amd,cmd.(总结一下,备忘速查)

commonjs

是采用动态编译方式进行加载文件。

  • require()导入,
  • module.exports = xxx或者exports.xxx=xxx用于导出.

每个文件内部都有一个module对象,里面有个属性exports,这个属性也是一个对象,打印一下

Module {
  id: '.',
  path: xxx,
  exports: {},
  parent: null,
  filename: xxx,
  loaded: false,
  children: [],
  paths: [
    xxx
  ]
  }

require 引入时候其实就是引入的目标文件的exports里面的内容。

既然module.exports 和 exports 都可以导出,他们之间有什么关联呢? 在每个模块的内部,默认执行了一步 module.exports = exports。这样来说module.exports = xxx ,exports.xxx=xxx 都可以暴露属性、方法。但是他们的区别就在于前者是为对象赋值,后者为对象增加属性。

注意:如果使用了module.exports = xxx 后续就不能使用exports.xxx=xxx了,因为 module.exports = exports 所产生的联系已经被断开

浏览器一般不识别require,如果要想在浏览器里面使用需要配合webpack,browserify插件去打包。

amd

这个是适用于浏览器的,异步加载文件的模块化方式。通过script,引入cdn, requirejs。

//用define函数去定义模块导出,其中xxx 是依赖于其他模块。
define([xxx],function(xxx){
   var a= x
   return {
     a,
  }
)
//用require去导入模块。
require(['jquery', 'xxx'],function($, xxx){ 
    //一些操作
});
//这里还需要对require.config去配置,配置一些路径这些。

cmd

个人理解cmd 更像是结合了amd,commonjs的优势的产品,这一点从名字上就不难看出。也是异步加载,也要引入sdn,sea.js

//用define函数去定义模块导出,其中xxx 是依赖于其他模块。内部用require,去引入
define(function(require, exports, module){
   var a= x
   //区别于amd,采用exports的形式去导出
   exports = {
}
)
//加载模块;
seajs.use(xxx.js

esmodule

这个应该最常见。是静态编译的,但是import()函数实现了动态引入, import 导入 ,export {},export default {} 导出;

export {
  a:xxx,
  b:xxx
}
//用export 导出时一定要通过 结构赋值导入。
import {a,b} from 'xxx'

export default {
    a:xxx;
    b:xxx
}

import  x from 'xxx'
console.log(x.a,x.b)

作为比较常见的两种模块方式,esmodule(浏览器主流模块应用方式),commonJS(node主流模块应用方式)。

  • 编译方式:esmodule 静态编译,但是import()可以实现动态引入。commonJS为动态编译。
  • 引入方式:esmodule 是引入了一个引用,就是说修改引入的文件会有影响。但是commonJS是引入的一个浅拷贝,所以来说是不太影响的(注意是浅拷贝)。
  • 使用方式:
  1. esmodule 只能在模块顶层使用,不能在函数、判断语句等代码块之中引用(import导入是静态的,并且还会有引入提升);commonJS 可以。
  2. ES6 模块可以在 import 引用语句前使用模块,CommonJS 则需要先引入后使用