3、模块化

什么是模块

解决的问题

模块化编程

CommonJS和 ES6 模块系统是 JavaScript 中两种主要的模块处理方式。它们在语法、加载方式和使用场景上都有显著的区别。

package.json中type属性

  1. type字段的产生用于定义package.json文件和该文件所在目录根目录中.js文件和无拓展名文件的处理方式。值为'moduel'则当作es模块处理;值为commonjs则被当作CommonJs模块处理
  2. 目前Node默认的是如果pacakage.json没有定义type字段,则按照CommonJs规范处理
  3. Node官方建议包的开发者明确指定package.jsontype字段的值
  4. 无论package.json中的type字段为何值,.mjs的文件都按照es模块来处理,.cjs的文件都按照CommonJs模块来处理

CommonJS和ES6的区别

CommonJS 和 ES6 模块系统各有优缺点,选择哪种模块系统取决于你的项目需求和运行环境。对于新的前端项目,推荐使用 ES6 模块,因为它是 JavaScript 的官方标准,并且支持更好的优化。对于现有的 Node.js 项目,CommonJS 仍然是一个可靠的选择。

CommonJS

CommonJs主要为了解决ES6之前无模块概念的问题

引入核心模块不需要写路径,引入文件模块需要写路径(一般是相对路径./../开头)

批量导出与导入

other.js

var msg = 'this is a model';
function myFunc(){
    console.log('this is a function by model');
}

// 批量导出
module.exports = {
    msg,
    myFunc,
    name: 'my name'
}

index.js

// 变量名字可以随便起,一般为文件名
// 引入同目录下的model.js,如果是相对路径,必须以./开头
// 此处的model.js的.js可以省略
var other = require('./other')

other.myFunc();
console.log(other.name);
console.log(other.msg);

逐一导出与选择性导入

other.js

var msg = 'this is a model';
function myFunc(){
    console.log('this is a function by model');
}

// 逐一导出
exports.msg = msg;
exports.myFunc = myFunc;
exports.name = 'my name'

index.js

// 无论是批量导出还是逐一导出都可以如下选择性导入
var {myFunc,msg,name} = require('./other')

myFunc();
console.log(name);
console.log(msg);

区别

ES6Modules

export

other.js

export var  msg = 'this is a model';

export function myFunc(){
    console.log('this is a function by model');
}

index.js

// 导入方式一:导入的多项组成一个对象
import * as other from './other.js'

other.myFunc();
console.log(other.msg);

// 导入方式二:选择性导入
import {myFunc,msg} from './other.js'

myFunc();
console.log(msg);

export default

other.js

var msg = 'this is a model';
function myFunc(){
    console.log('this is a function by model');
}

// 批量导出,一个模块中只能声明一个 export default
export default {
    msg,
    myFunc,
    name: 'my name'
}

index.js

import other from './other.js'

other.myFunc();
console.log(other.msg);
console.log(other.name);

注意:export default导出的不可以使用import {}解构导入!

全局变量

nodel中没有web中的全局变量window,node中的全局变量是global

console.log(global);

输出,看到封装了一些函数可以使用

<ref *1> Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  },
  queueMicrotask: [Function: queueMicrotask],
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  }
}
//声明一个全局变量a,因为每个模块单独运行在一个函数里面
a = 10;
console.log(global.a);