commonJs模块化

102 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

1.为什么要模块化

降低复杂度;解耦;部署优化

  • 2.好处

避免命名冲突;更好的分离按需加载;更高复用性;高可维护性

3.模块化分类

commonJs:

概念:每一个js文件都可当作一个模块;在服务端模块的加载是运行时同步加载的;在浏览器端模块需要提前编译打包处理

基本语法:

暴露模块方式

  1. module.exports = value
  2. exports.XXX = value

本质:暴露的是exports

引入模块:require(XXX) 注:第三方资源库:XXX为第三方模块名,自定义模块:XXX为模块文件路径

browserify(客户端打包文件第三方库): browserify 项目根目录开始需要打包文件路径 -o 项目根目录开始需要输出的文件路径

CMD: (阿里产品出售国外)

概念:专门用于浏览器端,模块的加载是异步的,模块在使用时才加载

基本语法:

  1. 定义没有依赖的模块

define(function(require,exports,module){

exports.XXX = value

或者module.exports = value

})

  1. 定义有依赖的模块

define(function(require,exports,module){

// 引入依赖模块(同步)

var module2 = require('./module2')

// 引入依赖模块(异步)

require.async('./module3',function(m3){

})

暴露模块: exports.XXX = value

})

  1. 引入模块:

define(function(require){

var module1 = require('./module1')

var module2 = require('./module2')

module1.show()

module2.show()

})

实现依赖第三方库(浏览器端): Sea.js

AMD:(也叫requireJs)

概念:专门用于浏览器端,模块的加载是异步的

基本语法:

暴露模块方式

  1. 定义没有依赖的模块

define(function(){

return 模块

})

  1. 定义有依赖的模块

define(['module1','module2'],(m1,m2)=>{

return 模块

})

引入模块:require(['module1','module2'],(m1,m2)=>{

使用m1/m2

})

实现依赖第三方库(浏览器端): Require.js

ES6:

依赖模块需要编译打包处理

1.语法:

导出模块 export

引入模块 import

  1. 实现依赖第三方库(浏览器端): babel (一个javascript 编译器)

https:babeljs.cn/repl

ES6-Babel-Browserify使用教程

  1. 定义package.json文件

  ```

  {

    "name" : "es6-babel-browserify",

    "version" : "1.0.0"

  }

  ```

  1. 安装babel-cli, babel-preset-es2015和browserify

  * npm install babel-cli browserify -g

  * npm install babel-preset-es2015 --save-dev

  * preset 预设(将es6转换成es5的所有插件打包)

  1. 定义.babelrc文件 --- run control (运行时的控制文件代表运行时会执行)

  ```

  {

    "presets": ["es2015"]

  }

  ```

  1. 编码

  2. 编译

  * 使用Babel将ES6编译为ES5代码(但包含CommonJS语法) : babel js/src -d js/lib

  * 使用Browserify编译js : browserify js/lib/app.js -o js/lib/bundle.js