require、import和export

关于require和import,先明确一些基础概念
1:require属于commonjs(ES5)规范,import属于ES6规范。
2:require/export 一般用于服务端(NodeJS)开发。 import由于是ES6规范,需要使用babel-loader转换为require
3:浏览器中要使用require语法的话,需要引用requirejs插件。 参考:http://www.nodeclass.com/articles/68336
4:require是运行时调用,import是编译时调用。
由于import适用于编译时,所以不能用条件判断:

// 报错
if (x === 2) {
  import MyModual from './myModual';
}

要实现条件判断,只能用require。

require是赋值过程,import是解构的过程。 通过以下示例可以看出区别:
counter.js

exports.count = 0
setTimeout(function () {
  console.log(`counter is ${++exports.count} in counter.js after 500ms`)
}, 500)

common.js

const {count} = require('./counter')
setTimeout(function () {
  console.log(`after 1s count is: ${count}`);
}, 1000)

运行: node common.js
结果如下图,可以看出,require是copy了导出的对象。

下面再用import的方式实现:
npm init
打开新建的package.json,添加: "type": "module"

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "es6.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "type": "module"
}

counter.js

let count=0;
setTimeout(function () {
  console.log('count is', ++count, 'in counter.js after 500ms')
}, 500)

export {count};

es6.js

import {count} from './counter.js'
setTimeout(function () {
  console.log('count in es6 after 1s is', count)
}, 1000)

最后: node es6.js

结果如下图,说明import没有copy一个新的对象,只是将export的对象结构

5:常用的import、export方式
5.1 对于命名导出的对象,可以使用as赋以别名,以避免重名

import {speak} from './cow.js'
import {speak} from './goat.js'	

使用as赋别名

import {speak as cowSpeak} from './cow.js'
import {speak as goatSpeak} from './goat.js'

5.2 命名空间引入

import * as cow from './cow.js'
import * as goat from './goat.js'

cow.speak() // moo
goat.speak() // baa

参考:https://juejin.cn/post/6844903623273480200
https://es6.ruanyifeng.com/#docs/module

posted @ 2020-11-20 20:58  老胡Andy  阅读(585)  评论(0编辑  收藏  举报