require和import的区别

起源

es6诞生之前,js一直没有模块系统,就连css都有@import,对现在复杂的大型项目开发无疑是一种阻碍。

es6在2015年6月正式发布,所以es6也有一个别称es2015。官方没有提出es6之前,社区给出了解决模块问题的方案,那就是node.js。

介绍到这个地方,其实require和import的起源已经出现了,es6中模块解决方案使用的关键字是import,而node.js提供的解决方案使用的关键字是require。

node.js由Ryan Dahl在2009年发布。node.js提供的模块化也叫CommonJS,不过node.js主要用于服务端的开发,但是随着时代的发展,现在的一些前端框架也依赖node.js

导出命令/引入命令

要想使用require或者import,首先得知道使用这两种方式对应的导出方式是怎样的,从现在开始,下文分别以CommonJS和es6来区分两种解决方案。

CommonJS

导出变量,方法,对象

// testcommonjs.js
exports.a = 123;
exports.b = 'hello';
exports.c = function(){
  console.log('ccc')
}
exports.d = {
  foo: 'bar'
}
//等价=> 
module.exports.a = 123;
module.exports.b = 'hello';
//等价=> 
module.exports = {
  a:123,
  b:'hello',
  c:function(){
    console.log('ccc')
  },
  d:{
    foo:bar
  }
}

建议使用module.exports,单独使用exports在某些情况下会产生意想不到的错误,这不是本文讨论的重点

引入和使用

//index.js
var test = require('./testcommonjs')
console.log(test.a)
console.log(test.b)
test.c()
console.log(test.d.foo)

es6

导出变量,方法,对象(这里只列举常用的一些方法,具体的使用方法请参考阮一峰es6入门)

//testesmodule.js
export var a = 123
export var b = 'hello'
export function c(){
  console.log('ccc')
}
export var d = {
  foo: 'bar'
}

引入和使用 

import { a,b,c,d } from './testesmodule'
console.log(a)
console.log(b)
c()
console.log(d.foo)
//等价=> 
import * as test form './testesmodule'
console.log(test.a)
console.log(test.b)
test.c()
console.log(test.d.foo)

静态优化

这是从阮一峰大神的文档中学习到的一个概念。他在文档中以node的核心模块fs举了一个例子

es6

// ES6模块
import { stat, exists, readFile } from 'fs';

注:不要试图在没有配置babel的项目中去测试上面的代码,因为node到目前为止依然不支持es6的模块化语法(笔者目前的node版本:v10.15.0),尽管它已经实现了绝大部分的es6特性。

CommonJS

// CommonJS模块
let { stat, exists, readFile } = require('fs');

这样看起来,fs模块的引入方式在es6中和CommonJS中似乎只是语法上的区别,但是实际上,在CommonJS中上述代码的处理方式是这样的

let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
let readfile = _fs.readfile;

也就是说,为了使用fs中的stat、exists、readFile方法,在代码执行使必须把fs整个模块全部加载进来,生成一个对象_fs,然后再从这个对象上面读取3个方法,这种加载被称为“运行时加载”,因为只有运行时才能得到这个对象。

而es6模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量,从这个角度上来看,es6的模块化效率要比CommonJS高得多。阮一峰大神在文档中还列举了一些静态加载的其他优点,但是本菜鸟并不能看懂╮(╯▽╰)╭

新的思考:

fs是node.js的核心模块,为什么es6的模块化语法能够生效,在ws中通过文件定位,发现node.js的核心模块代码全是用ts写的,但是由于对ts语法不太熟悉,无法理解ts是如何能够做到既兼容CommonJS又兼容es6的。

(com)require和import,动态和静态

require和import的区别问题

require用于读取并执行js文件, 并返回该模块的exports对象, 若无指定模块, 会报错。CommonJS规范加载模块是同步且动态的, 只有加载完成, 才能执行后续操作。可以在代码中引入

import用于引入外部模块, 其他脚本等的函数, 对象或者基本类型。

import属于ES6的命令, 它和require不一样, 它会生成外部模块的引用而不是加载模块,等到真正使用到该模块的时候才会去加载模块中的值。

动态引入和静态引入

webpack支持node的commonJS标准,而且它的require实现和node极为类似;所以将node的require和webpack的require放在一起讲:

而且因为vue用了webpack,所以在vue中webpack的require也可以使用;

require是动态引入,因为他是运行时调用,可以放在代码的任何位置。

使用webpack的require需注意:

let url = "@/assets/images/carousel/logo.svg"
require(url)    //报错
let url = "logo.svg"
require("@/assets/images/carousel/" url); //正确

不能直接给require变量,要给require一个初始的地址,具体的文件名给变量,以方便遍历

而import支持静态引入和动态引入两种:

1.静态引入

import { a, b, c } from "./a";

2.动态引入

if (condition) {
  import('moduleA').then(...);
} else {
  import('moduleB').then(...);
}

PS1:区分静态和动态

静态是按照文件的嵌套关系找到文件或者分析代码,不需要运行

动态与执行顺序有关,会在执行的过程中根据变化进行一些操作

PS2:node中两种导出方式的区别

1.置换exports整个对象

module.exports = {}   
const lib = require("xxx")

2.不置换,只是编辑exports,加属性,这个aaa就是key

exports.aaa === module.exports.aaa
exports.aaa = 123
const {aaa} = require("xxx")

无论时哪种,最后返回的都是exports对象,都可以通过键值从里边拿值

PS3:ES6中两种导出方式的区别

1.export

export   func1=()=>{}
export   func2=()=>{}
import { func1, func2 } from 'xxx';

2.export default

export default class Example{}
import Example from "xxx"

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

js中关于require与import的区别及说明的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  4. Swift与Js通过WebView交互

    开发环境:Swfit2.3XCode8.2基础概念jscontext,jscontext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码JSValue,JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等JSExport,JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用Swif

  5. JSCore swift

    如果双方相互引用,会造成循环引用,而导致内存泄露。以上是Jscore的基本使用,比较简单

  6. Swift WKWebView的js调用swift

    最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制另外一个博客,都没有去实际敲代码验证,下面给大家分享一下我的学习过程。

  7. Swift WKWebView的swift调用js

    不多说,直接上代码:在html里面要添加的的代码,显示swift传过去的参数:这样就实现了swift给js传参数和调用!

  8. 在 Swift 專案中使用 Javascript:編寫一個將 Markdown 轉為 HTML 的編輯器

    你有強烈的好奇心,希望在你的iOS專案中使用JavaScript。jscontext中的所有值都是JSValue對象,JSValue類用於表示任意類型的JavaScript值。因此,我們既需要寫Swift代碼也要寫JavaScript代碼。此外,我們還會在JavaScript中按照這個類的定義來創建一個對象并對其屬性進行賦值。從Swift中呼叫JavaScript就如介紹中所言,JavaScriptCore中最主要的角色就是jscontext類。一個jscontext對象是位於JavaScript環境和本

  9. swift - WKWebView JS 交互

    本文介绍WKWebView怎么与js交互,至于怎么用WKWebView这里就不介绍了HTML代码APP调JS代码结果JS给APP传参数首先注册你需要监听的js方法名2.继承WKScriptMessageHandler并重写userContentController方法,在该方法里接收JS传来的参数3.结果

  10. swift 开发UIWebView跟JS的交互

    前言作为小白的我,才开始入门IOS,选择了swift来进行入门学习,学习做着公司一个简单的小小项目,该项目需要进行跟H5进行交互,然后我就开始研究了UIWebView的使用,其实基本原理跟Android的一样,因为我是Android开发的,所以就顺水推舟了。))//这里设置你需要加载的地址}overridefuncdidReceiveMemoryWarning(){super.didReceiveMemoryWarning()//disposeofanyresourcesthatcanberecreate

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部