理解一下ES6的模块化开发-----《整理》

前端经典面试题(58道前端面试题包含JS、CSS、React、程序题等) 简答题 1、什么是防抖和节流?有什么区别?如何实现? 参考答案 防抖 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 思路: 每次触发事件时都取消之前的延时调用方法 function debounce(fn) { let timeout = null; // 创建一个标记用来存放定时器的返回值 return function () { clea... 阅读详情

1.模块化开发背景介绍:

2.模块化有哪些规范:

           AMD、CommonJS、ES6

           其中AMD是浏览器端规范,CommonJS是服务端规范,而ES6是一个统一的规范(虽然好多浏览器还不支持)

3.首先有个整体上的认知:

           ES6中定义的:import、export

           CommonJS中定义的:require、module.exports


4.介绍一下常见用法:

4.1ES6

 

export var a = 1;

//main.js
var a = 1;
var b = 2;
function foo(){};
function boo(){};
export {a, b, foo, boo as Boo};

//main2.js
export default defaultFoo; //export {defaultFoo as default};


//导出对象时需要加{}
//导出对象时可以为每一个属性指定别名
//可以同时导出多个属性


import {a, b} from './main.js'
import {foo as Foo, Boo as B} from './main.js'
import defaultFoo from './main2.js'    //import {default as defaultFoo} from './main2.js'

//导入的变量名必须与导出的名称一致
//导入时可以按需导入
//导入时可以指定别名

4.2CommonJS

//main.js
var a = {
    name: 'leeon',
    age: 23,
    setName: function(name){
        this.name = name
    }
}
module.exports = a;





var a = require('./main.js');

5.而在项目中,通常会使用到webpack+babel:

就出现了好多混用上面两种规范的情况,实际上只是由babel将es6转成了CommonJS,并不代表es6与CommonJS的规范是一回事儿。

而webpack则会将项目中的es6、CommonJS规范转换为自己独特的模块化语法。

那么babel在转换es6的模块化输入输出时做了什么?

babel 转换 es6 的模块输出逻辑非常简单,即将所有输出都赋值给 exports,并带上一个标志 __esModule 表明这是个由 es6 转换来的 commonjs 输出。

babel将模块的导出转换为commonjs规范后,也会将引入 import 也转换为 commonjs 规范。即采用 require 去引用模块,再加以一定的处理,符合es6的使用意图。
 

众所周知,require在引入依赖时加载的整个对象,不存在按需加载的优化,那么babel统一的将import转化为了require岂不是让项目引入了很多不必要的依赖?

注意:这里有个关于require与import的问题:

// counter.js
exports.count = 0
setTimeout(function () {
  console.log('increase count to', ++exports.count, 'in counter.js after 500ms')
}, 500)

// commonjs.js
const {count} = require('./counter')
setTimeout(function () {
  console.log('read count after 1000ms in commonjs is', count)
}, 1000)

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


//read count after 1000ms in commonjs is 0
//read count after 1000ms in es6 is 1

这里的结论是:es6的导入方式是动态的,强绑定的方式,而commonjs的导入方式则是浅拷贝的方式传递 

demo来自知乎: https://www.zhihu.com/question/56820346 寸志大佬的回答

当然不是,1.使用 babel-plugin-component 等babel 插件会将依赖的引入方式优化;

import { React, ReactDom } from 'react'


//babel会先做这件事
var a = require('react');    //引入react中导出的全部属性
var React = a.React;
var ReactDom = a.ReactDom;

//而babel-plugin-component插件所做的事情就是将依赖最小化,当然,写导出文件时也需要有一定的技巧(意想之中)
import React from 'react/lib/React'
import ReactDom from 'react/lib/ReactDom'

2.webpack使用tree-shaking技术

webpack2 开始引入 tree-shaking 技术,通过静态分析 es6 的语法,可以删除没有被使用的模块。他只对 es6 的模块有效,所以一旦 babel 将 es6 的模块转换成 commonjs,webpack2 将无法使用这项优化。所以要使用这项技术,我们只能使用 webpack 的模块处理,加上 babel 的es6转换能力(需要关闭模块转换)。

注:webpack的tree-shaking仅仅对于原本就是使用es6规范的生效

 

总结:

babel会将es6转为CommonJS的方式(exports);

webpack则会将CommonJS与es6都转为自己的方式。

参考文章:

 https://segmentfault.com/a/1190000012386576 《import、require、export、module.exports 混合使用详解》

一小时速通JavaScript模块化,涵盖CommonJS与ES6模块化 阅读详情

相关推荐

ES6面试题整理

ES6面试题整理

touzhu11的博客 853

使用 ES6 进行开发

es6

根是地下的枝 2886

常用Es6-9整理

--------------------------es6 ------------------------------ *1,Let(块作用域)与Const(常量),let 只能声明一次 var 可以声明多次: *2,模板字符串 *3,es6中class类 *4,箭头函数 => *5,模块化 import && export *6,js 之generator(ES6提供的) *7,解构赋值 let { a, b } = { a: 1, b: 2 } *8,延展操作符

代码青春 229

es6 解构赋值

解构赋值 使用数组成员对变量赋值时,优先使用解构赋值。 const arr = [1, 2, 3, 4];// badconst first = arr[0];const second = arr[1];// goodconst [first, second] = arr; ES6 函数的参数如果是对象的成员,优先使用解构赋值。 // badfunction getFullName

歪脖先生的博客 438

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

ACGkaka的博客 6984

python制作图形化小游戏_创意编程|Python的GUI简易界面设计测测你的反应力

Python的GUI简易界面设计案例测测你的反应力作为初次接触代码编程的你,是不是觉得Python程序除了“码”就是“字”即使是有趣的程序除了烧烧自己的脑,也吸引不到更多人的兴趣,用户体验值接近于0?那你可冤枉了Python,他可是人工智能界的编程语言大咖。今天这个游戏设计就先带领大家,简单体验一下,如何让Python程序图形化。一起来吧!设计我们的小游戏游戏设计思路:电脑随机出...

weixin_34214135的博客 1872

浅谈ES6模块化

一、什么是ES6模块化 在ES6之前,JS一直没有模块体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法将他们拼装起来。尽管社区制定了一些模块加载方案,主要有CommonJS和AMD两种,但是这两种方案都有自己的局限性,前者主要用于服务器,后者主要用于浏览器。 ES6在语言规格的层面上实现了模块功能,而且实现的相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。 ES6模块的设计思想是尽量静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变

guxin_duyin的博客 598

数据字典实战:如何用Excel快速搭建你的第一个数据字典(附模板下载)

本文针对中小团队在软件开发中面临的术语不一致问题,提供了一套使用Excel快速搭建数据字典的实战指南。文章详细讲解了核心字段设计、填充示例、高阶技巧及团队协作维护流程,旨在通过这一轻量级工具统一团队共识、提升开发效率,并附有实用模板下载。

weixin_29303701的博客 380

ES6模块化

es6模块化

weixin_47155623的博客 546

s8654

The official Snapdragon Ride SX 4.0 development board provides standardized hardware support for the secondary development and functional verification of the s8654 platform.

qq_39257814的博客 6834

杰理AC696N系列芯片,烧录的时候烧录器连接上芯片之后电脑显示无法识别该设备,该怎么解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1714

ES6 模块化

ES6 模块化规范是浏览器端与服务器端通用的模块化开发规范。它的出现极大的降低了前端开发者的模块化学习成本,开发者不需再额外学习 AMD 、CMD 或 CommonJS 等模块化规范。ES6 模块化规范中定义:每个 js 文件都是一个独立的模块导入其它模块成员使用import关键字向外共享模块成员使用export关键字。

Cxil的博客 1281

C#上位机开发实战全流程:从需求到落地,避坑指南+完整代码

作为一名做了5年工业自动化上位机开发的程序员,我踩过的坑比写过的代码还多——从最初串口通信粘包导致数据错乱,到可视化图表卡顿卡死,再到现场异常崩溃无日志可查,每一次踩坑都是一次血泪教训。今天这篇文章,我会把C#上位机开发的全流程拆解开,从需求分析到通信模块、数据可视化,再到异常处理,每个环节都结合工业实际场景,分享真实项目中能用的方案、完整代码和避坑技巧。不管你是刚入门的新手,还是想优化现有项目的老司机,相信都能有所收获。很多新手做上位机开发,一上来就闷头写代码,最后发现做出来的东西不符合现场需求——比如客

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 996

45道工程模块化高频题整理(附答案背诵版)

前端自动化构建工具如Webpack、Gulp、Grunt、Parcel和Rollup等,通过自动化处理代码压缩、文件合并、预处理器编译等任务,提高开发效率和代码质量。Webpack是最流行的模块打包工具,支持多种资源打包;Gulp基于流处理,简单易用;Grunt配置优先,插件丰富;Parcel零配置,适合中小项目;Rollup专注于ES6模块,适合库开发。 前端开发中常用的库包括React、Vue.js、Angular、jQuery和Lodash,工具如Visual Studio Code、Git、Chro

IT6666_it的博客 947

Far planner 代码系列(14)

MatchContourWithNavGraph(3) this->EnclosePolygonsCheck(); //可能有些ctnode的is_contour_necessary属性变成了true // 这说明我的contour_graph是一个local层级的 才会从这里面 get new vertices new_convex_vertices.clear(); //! 把contour_graph_里符

博客 900

【OpenClaw从入门到精通】零基础入门——OpenClaw核心概念快速理解(2026入门版)

OpenClaw是一个强大的AI代理框架,旨在构建智能化的自动化任务处理系统。随着人工智能技术的快速发展,OpenClaw为开发者和企业提供了一个完整的解决方案,用于创建能够理解、学习和执行复杂任务的智能体。本文将带领零基础的读者快速理解OpenClaw的核心概念,从基础架构到实际应用,为后续深入学习奠定坚实基础。通过本文的学习,你将掌握OpenClaw的基本原理、核心组件和快速上手方法。

一键难忘的博客 325

vue - ES6模块化、promise、webpack打包(所在在学的朋友们先看这篇,看了不吃亏)...

首先我要说明一下,没错,还是没有进入vue,刘备请诸葛亮三次都可以了吧,我这也是第三次了,也绝对是最后一次了,我应经摸透了因为,最后的webpack打包加上一个git学了过后我就去vue了。为什么要说先看这篇,其实跟我们今天的主题webpack没有太大关系,昨天学了一下webpack,其实内容没多少,webpack的内容无非就是参考文档去怎么做,然后最主要的js、html...

web全栈开发的博客 743

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OpenChamber 1.19.0 版本解读:Claude 用量限额、Project Knowledge 与集成管理

> 本文基于仓库 [changelog/1.19.0.md](https://link.gitcode.com/i/98eebe825c0f0f8a5c31d1413056ea8c) 的发布说明展开,并结合 [packages/web/server/lib/quota/DOCUMENTATION.md](https://link.gitcode.com/i/49113fcade5d2e3676d5

gitblog_00962的博客 793

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

春招遇到的前端面试问答汇总(字节、腾讯、阿里、美团)——自己总结,建议保存

***http 和 https 区别 1.https协议需要到ca(电子认证服务,是指为电子签名相关各方提供真实性、可靠性验证的活动。)申请证书,一般免费证书较少,因而需要一定费用。 2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。(非对称加密) 3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 4.http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协

homjeong的博客 470

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

对ES6模块化的一些理解和整理

前段时间在网上看了一点关于es6模块化的一些资料, 发现很多在es6的介绍里很多都只是介绍了es6的语法,并没有提到编译的过程,所以在这整理一下 ; es6的模块化语法很简单; 暴露用export,或export default, 前者将暴露为一个对象,后者为自定义暴露; 引入用import 引入export的模块,用{}解构赋值来按需加载(我记得之前可以用obj.key的方式取值的,可...

haidizhixin121的博客 1017

前端面试题(JavaScript基础篇)

JavaScript基础篇共有面试题62道 1、介绍JavaScript的基本数据类型? 基本数据类型:Number、String、Boolean、Null、Undefined object是JavaScript中所有对象的父对象 数据封装类对象:object、Array、Boolean、Number、String 其它对象:Function、Arguments、Math、Date、Error、RegExp 其它数据类型:Symbol 2、浅谈JavaScript中

熊猫的博客 3451

【Vue前置必备知识篇】 --- ES6模块化与异步编程高级用法_vue前置知识

*ES6 模块化规范是浏览器端与服务器端通用的模块化开发规范。**它的出现极大的降低了前端开发者的模块化学习成本,开发者不需再额外学习 AMD、CMD 或 CommonJS 等模块化规范。每个 js 文件都是一个独立的模块导入其它模块成员使用import关键字向外共享模块成员使用export关键字😆温馨提醒😆:第 5 行代码中的 new Promise() 只是创建了一个形式上的异步操作。是 ES8(ECMAScript 2017)引入的新语法,用来简化 Promise 异步操作。在。

2401_84520271的博客 1390

ES6前端面试题整理

ES6前端面试题整理,es5和es6的区别, ES6新增的一些特性,箭头函数,模板字符串,解构赋值,... 展开运算符,修饰器 @,Symbol,Proxy代理,使用箭头函数应注意什么?Set、Map的区别?setTimeout、Promise、Async/Await 的区别,用class 手写一个promise,es6的导入导出模块

LYFlied的博客 7940

弄懂前端模块化,CommonJS,AMD,CMD及ES6模块化

前言 之前一直对于前端的模块化理解的不太透彻,平常一直用的也只有ES6模块化,对于其他几种模块化规范用的也少,理解不够深,但是经常会见到一些面试题是问这几种模块化规范的区别,所以这次做一个整理总结 一、对于模块化的理解 什么是模块化? 模块化开发是一种管理方式,是一种生产方式,一种解决问题的方案,一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块,但是模块开发需要遵循一定的规范,否则就都乱套了,因此,才有了后来大家熟悉的AMD规范,CMD规范,以及ES

index_zhao的博客 787

模块化机制(ES6模块化和CommonJS模块化详解)

一、模块化的理解 1.什么是模块? 将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起 块的内部数据与实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信 2.模块化的好处 避免命名冲突(减少命名空间污染) 更好的分离, 按需加载 更高复用性 高可维护性 二、模块化规范 模块化规范有CommonJS、AMD、CMD、ES6模块化 这篇文章主要对CommonJS和ES6模块化进行一个汇总整理(在nodejs上运行) 1.ES6模块化(...

qq_45867474的博客 1181

ES6面试题整理汇总

ES6面试题整理汇总

山雀的博客 8449
上一篇: 别在意你收集了什么
下一篇: 使用TortoiseGit拉取远程代码时报错ssh variant ‘simple‘ does not support setting port及SSH2_MSG_UNIMPLEMENTED
MengL_unfor
博客等级 码龄11年 8粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值