require 和 import,都是为了JS模块化使用。最近项目中,因为多人协同开发,出现了一个项目中同时使用了require 和 import 引入依赖的情况。正常情况下,一个项目中最好是对引入方式做一个规范。下面我们就来看一下require 和 import的区别:

一.require
  require是Commonjs的规范,node应用是由模块组成的,遵从commonjs的规范。用法:

 a.js

function test (args) {
// body...
console.log(args);
} module.exports = {
test
};
b.js let { test } = require('./a.js'); test('this is a test.');

require的核心概念:在导出的文件中定义module.exports,导出的对象类型不予限定(可为任意类型)。在导入的文件中使用require()引入即可使用。本质上,是将要导出的对象,赋值给module这个对象的exports属性,在其他文件中通过require这个方法来访问exports这个属性。上面b.js中,require(./a.js) = exports 这个对象,然后使用es6取值方式从exports对象中取出test的值。

二.import
import是es6为js模块化提出的新的语法,import (导入)要与export(导出)结合使用。用法:

a.js:

export function test (args) {
// body...
console.log(args);
} // 默认导出模块,一个文件中只能定义一个
export default function() {...}; export const name = "lyn";
b.js: // _代表引入的export default的内容
import _, { test, name } from './a.js'; test(`my name is ${name}`);

三、commonjs模块与ES6模块的区别
    1.commonjs输出的,是一个值的拷贝,而es6输出的是值的引用;

2.commonjs是运行时加载,es6是编译时输出接口;

文章目录
概念
一、ES6模块化的使用
、es6中的export
、es6中的import
二、CommonJs规范的使用
、CommonJs中的exports
、CommonJs中的require
三、CommonJs规范与ES6中import的区别
、引入模块的不同点
、引入模块的性能不同点
、暴露模块的不同点
四、在nodeJs中怎么使用
概念
CommonJs是一种模块化规范,在ES6之前的,用于服务器端nodeJs和浏览器端。 ES6标准发布后,模块化标准是以export指令导出接口,以import引入模块。 但是在node模块中,我们依旧很多地方采用的是CommonJS规范
即:使用module.exports导出接口,使用require引入模块。 这两种方式我们或多或少都有用过,只是不了解这是2种不同的规范 一、ES6模块化的使用
es6中模块化靠export { }暴露导出模块,靠import ... from '...'引入模块 、es6中的export
模块js使用export命令输出变量 注意:这里输出的必须是变量,而不能是值(包括方法) 注意:export命令不需要=,只要后面跟一个变量即可 正确示例:
// 直接暴露
export var test = 'Michael'; // 设置变量暴露
var test = 'Michael';
export {
test
}
错误示例:
// 直接暴露
export ; //报错
// 设置变量暴露 var test = ;
export test; //报错 以上错误的原因,是因为export命令后面不是变量而是一个值,即使是赋值给了test,它也是一个值(方法同理)。
正确用法中是把值包在了对象里{ test }
、es6中的import
目标文件,使用import ... form '...'引入模块(前提是暴露模块正确) import命令引入没什么坑,主要延伸是结合ES6的解构赋值 普通引入示例
import fs from 'fs' //引入整个fs模块 var test = fs.star(....) //调用fs模块中的star方法 解构引入示例
import { stat,readFile } from 'fs' //引入fs模块中的stat,readFile方法,其余不引入 var test = star(....) //调用fs模块中的star方法 二、CommonJs规范的使用
CommonJs规范靠exports.xx = xx或module.exports = { xx }暴露导出模块。
靠var xx = require('...')或var { stat, exists, readFile } = require('fs');引入模块 、CommonJs中的exports
注意:这里的exports不是一个命令
注意:这里的exports是有s的,且后面需要使用=,这里我的理解,exports自身是变量,引入就是依靠这个变量进行的 使用exports示例
var test = ;
exports.test = test; 使用module.exports示例
var test = ;
module.exports = {
test
} 、CommonJs中的require
导入也没什么坑,同样可以使用解构 普通引入示例
var fs = require('fs') //引入整个fs模块 var test = fs.star(....) //调用fs模块中的star方法 解构引入示例
var { stat,readFile } = require('fs') //引入fs模块中的stat,readFile方法,其余不引入 var test = star(....) //调用fs模块中的star方法 三、CommonJs规范与ES6中import的区别
、引入模块的不同点
require('xx')可以直接作为一个对象,也就是可以直接当成变量来使用,不赋值。如:require('xx').star(...)
而es6的import ... form ...是固定写法,不能操作
、引入模块的性能不同点
CommonJs规范的引入require('xx')是“运行时加载” 而es6的import ... form ...是按需引入,编译过程按照import命令来选择编译 、暴露模块的不同点
在上面使用介绍,暴露模块的区别已经很明显了:
es6的export命令不用=暴露一个变量(一般为对象)
CommonJs的exports.xx=xx,是依靠exports变量自身来暴露的
四、在nodeJs中怎么使用
我们都知道es6是绝对通用的规范,且会更新到es7、es8等。而既然es6有模块化的方法,那么CommonJs规范将逐步被替换。
但是现在而言,import、export等很多es6命令,还需要依靠编译成es5来实现。
比如在vue-cli当中,es6的使用就需要依赖webpack的babel进行编译成es5。
所以在nodeJs中如果不引入babel或其他方法来编译es5的话,依旧需要老老实实使用CommonJs规范。
ndoeJs使用es6import、export命令的解决方法,可以看阮一峰老师的ECMAScript6,.mjs后缀文件名
本文参考阮一峰老师的ECMAScript6 与一些关于js编译与运行的博客

.

require与import的更多相关文章

  1. 转:彻底搞清楚javascript中的require、import和export

    原文地址:彻底搞清楚javascript中的require.import和export   为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Ja ...

  2. 008_Node中的require和import

    一.js的对象的解构赋值 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuri ...

  3. NodeJS中的require和import

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...

  4. vue 更新了vue-cli到最新版本后引发的问题: require和import、vue-loader的问题

    "vue-loader": "^12.1.0", "vue-loader": "^12.1.0", "vue- ...

  5. javascript中的require、import和export模块文件

    CommonJS 方式 文件输出如math.js: math.add = function(a,b){ return a+b; }exports.math = math; 文件引入: math = r ...

  6. JS 中的require 和 import 区别整理

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...

  7. Node中没搞明白require和import,你会被坑的很惨

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...

  8. require和import的使用

    一.前言 ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引 ...

  9. Node中导入模块require和import??

    转自:https://blog.csdn.net/wxl1555/article/details/80852326 S6标准发布后,module成为标准,标准的使用是以export指令导出接口,以im ...

随机推荐

  1. 同步工具类 CountDownLatch 和 CyclicBarrier

    在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解 线程的 wait() notify() notifyall() 方法 线程异 ...

  2. CCNA 之 九 STP生成树协议

    STP生成树 在上一次实验中,使用了单臂路由是两个不同的VLAN之间进行通信,而单臂路由的这种网络拓扑,当一条链路或者路由设备出现故障的时候,整个网络就会瘫痪. 称此网络为:不健壮的,无冗余的网络环境 ...

  3. Spring之junit测试集成

    简介 Spring提供spring-test-5.2.1.RELEASE.jar 可以整合junit. 优势:可以简化测试代码(不需要手动创建上下文,即手动创建spring容器) 使用spring和j ...

  4. Python协程与Go协程的区别二

    写在前面 世界是复杂的,每一种思想都是为了解决某些现实问题而简化成的模型,想解决就得先面对,面对就需要选择角度,角度决定了模型的质量, 喜欢此UP主汤质看本质的哲学科普,其中简洁又不失细节的介绍了人类 ...

  5. 转:SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)

    开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVE ...

  6. springcloud+kafka集群

    上节说了kafka在linux环境下怎么搭建集群.这节写一下怎么在springcloud中以stream流方式去做kafka集群对接. 1.yml配置 #spring Cloud kafka -- s ...

  7. python 拷贝文件夹下的文件 到 另一个文件夹

    import os,shutil def copy_search_file(srcDir, desDir): ls = os.listdir(srcDir) for line in ls: fileP ...

  8. Tomcat下载安装并部署到IDEA(附带idea两种热部署设置方法)

    目录 Tomcat下载教程 Tomcat安装教程 Tomcat热部署到IDEA idea两种热部署设置方法 使用Idea的时候,修改了代码,需要反复的重启Tomcat,查看效果,是不是贼烦?还记得刚上 ...

  9. Java修炼——基于TCP协议的Socket编程_双向通信_实现模拟用户登录

    首先我们需要客户端和服务器端. 服务器端需要:1.创建ServerSocket对象.2.监听客户端的请求数据.3.获取输入流(对象流)即用户在客户端所发过来的信息.                  ...

  10. 2019 牛客国庆集训派对day1-C Distinct Substrings(exkmp+概率)

    链接:https://ac.nowcoder.com/acm/contest/1099/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...