Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【模块化】:ES6 模块化

【模块化】:ES6 模块化

作者头像
WEBJ2EE
发布于 2022-03-30 13:05:24
发布于 2022-03-30 13:05:24
62900
代码可运行
举报
文章被收录于专栏:WebJ2EEWebJ2EE
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
目录
1. ES6 规范 
  1.1. 导出和导入
    1.1.1. Default Exports(默认导出)
    1.1.2. Named Exports(命名导出)
    1.1.3. Import All The Things(导入所有)
    1.1.4. Export All The Things(导出所有)
    1.1.5. Dynamic Import(动态导入)
    1.1.6. import.meta
  1.2. Mutable Bindings
  1.3. Imported Variables Are Read-only
2. classic scripts 和 modules 的差别
3. 新提案:import-maps
  2.1. "bare" import specifiers
  2.2. Import maps

1. ES6 规范

1.1. 导出和导入

1.1.1. Default Exports(默认导出)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// hello-world.js
export default function() {}

// main.js
import helloWorld from './hello-world';
import anotherFunction from './hello-world';

helloWorld();
console.log(helloWorld === anotherFunction);

JavaScript 的值也可以被默认导出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default 3.14;
export default {foo: 'bar'};
export default 'hello world';

1.1.2. Named Exports(命名导出)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const PI = 3.14;
const value = 42;
export function helloWorld() {}
export {PI, value};

导出的时候还可以重命名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const value = 42;
export {value as THE_ANSWER};

导入变量的时候也可以重命名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import {value as THE_ANSWER} from './module';

1.1.3. Import All The Things(导入所有)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// module.js
export default 3.14;
export const table = {foo: 'bar'};
export function hello() {};

// main.js
import * as module from './module';
console.log(module.default);
console.log(module.table);
console.log(module.hello());

1.1.4. Export All The Things(导出所有)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// module.js
const PI = 3.14;
const value = 42;
export const table = {foo: 'bar'};
export function hello() {};

// main.js
export * from './module';
export {hello} from './module';
export {hello as foo} from './module';

1.1.5. Dynamic Import(动态导入)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import('/modules/my-module.js')
  .then((module) => {
    // Do something with the module.
  });

1.1.6. import.meta

import.meta 是一个给 JavaScript 模块暴露特定上下文的元数据属性的对象。它包含了这个模块的信息,比如说这个模块的URL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import.meta

1.2. Mutable Bindings

Imported bindings refer to variables inside a module’s body. This causes an interesting sideeffect when you import “by value” variable such as Number, Boolean, or String. It’s possible that the value of that variable will be changed by an operation outside of the importing module.

1.3. Imported Variables Are Read-only

No matter what kind of declaration is being exported from a module, imported variables are always readonly. You can, however, change an imported object’s properties.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// module.js
export let count = 0;
export const table = {foo: 'bar'};

// main.js
import {count, table} from './module;

table.foo = 'Bar'; // OK
count++; // read-only error

2. classic scripts 和 modules 的差别

除了上面这些差异,还有:

  • module 被引入多次,只会执行一次;但 script 会执行多次;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="classic.js"></script>
<script src="classic.js"></script>
<!-- classic.js executes multiple times. -->

<script type="module" src="module.mjs"></script>
<script type="module" src="module.mjs"></script>
<script type="module">import './module.mjs';</script>
<!-- module.mjs executes only once. -->
  • modules 默认是 deferred。classic scripts 则会阻塞 HTML 的解析。

3. 新提案:import-maps

3.1. "bare" import specifiers

首先

在 ES6 的 import 语句中

我们称呼下图红框中的部分为

“module specifier”

When importing modules, the string that specifies the location of the module is called the “module specifier” or the “import specifier”.

在 “module specifier” 中

有些并不是以 "/"、“./”、"../" 开头

我们称呼这些为

“bare import module specifier”

但是HTML官方规范中表示

但凡不是以 "/"、“./”、"../" 开头的

不会被当做相对路径处理

会报错

可是我们的确一直都在写

import {useState} from "react"

import {ref, reactive} from "vue"

没见报错啊?为什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Vue from 'vue'
import _ from 'lodash'
import axios from "axios"

那是因为像 Webpack、Vite 这样的打包工具

已经给你把路径转换工作干了

这有什么问题么?

Today, many web developers are even using JavaScript's native module syntax, but combining it with bare import specifiers, thus making their code unable to run on the web without per-application, ahead-of-time modification. We'd like to solve that, and bring these benefits to the web.

问题就是

原生开发时(不依赖打包工具)你会遇到很多麻烦

1. npm 上多数都是 CJS 的包,需要单独找 ES6 版的包

2. 路径问题太复杂,需要根据运行环境写不同的代码

3.2. Import maps

Importmaps 提案

就是让浏览器原生支持

“bare import specifier”

看一个例子

浏览器兼容性怎么样?

参考:

resolve a module specifier: https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-module-system import-maps: https://github.com/WICG/import-maps Using ES modules in browsers with import-maps: https://blog.logrocket.com/es-modules-in-browsers-with-import-maps/ An Introduction To JavaScript ES6 Modules https://strongloop.com/strongblog/an-introduction-to-javascript-es6-modules/ exploringjs:modules https://exploringjs.com/es6/ch_modules.html#sec_overview-modules JavaScript modules: https://v8.dev/features/modules

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebJ2EE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
require和import的区别
CommonJs 规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的 exports属性(即module.exports)是对外的接口,加载某个模块,其实是加载该模块的module.exports属性。
木子星兮
2020/07/16
1.2K0
10个最佳ES6特性
为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。
疯狂的技术宅
2019/03/28
5030
前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
使用vue-cli可以规范项目,提高开发效率,但是使用vue-cli时需要一些ECMAScript6的知识,特别是ES6中的模块管理内容,本章先介绍ES6中的基础与模块化的内容再使用vue-cli开发vue项目。 一、ECMAScript6概要 ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaSc
张果
2018/03/30
1.8K0
前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
前端模块化详解(完整版)
上例子通过jquery方法将页面的背景颜色改成红色,所以必须先引入jQuery库,就把这个库当作参数传入。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显。
小生方勤
2019/06/01
2.2K0
前端模块化详解(完整版)
在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升,很多页面逻辑迁移到了客户端(表单验证等),随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀,此时在JS方面就会考虑使用模块化规范去管理。 本文内容主要有理解模块化,为什么要模块化,模块化的优缺点以及模块化规范,并且介绍下开发中最流行的CommonJS, AMD, ES6、CMD规范。本文试图站在小白的角度,用通俗易懂的笔调介绍这些枯燥无味的概念,希望诸君阅读后,对模块化编程有个全新的认识和理解!
Nealyang
2019/09/29
1.3K0
前端模块化详解(完整版)
前端模块化的今生
众所周知,早期 JavaScript 原生并不支持模块化,直到 2015 年,TC39 发布 ES6,其中有一个规范就是 ES modules(为了方便表述,后面统一简称 ESM)。但是在 ES6 规范提出前,就已经存在了一些模块化方案,比如 CommonJS(in Node.js)、AMD。ESM 与这些规范的共同点就是都支持导入(import)和导出(export)语法,只是其行为的关键词也一些差异。
ConardLi
2019/12/17
7040
前端模块化-CommonJS,AMD,CMD,ES6
随着 JavaScript 工程越来越大,团队协作不可避免,为了更好地对代码进行管理和测试,模块化的概念逐渐引入前端。模块化可以降低协同开发的成本,减少代码量,同时也是“高内聚,低耦合”的基础。
李振
2021/11/26
4230
Javascript模块化详解
前端的发展日新月异,前端工程的复杂度也不可同日而语。原始的开发方式,随着项目复杂度提高,代码量越来越多,所需加载的文件也越来越多,这个时候就需要考虑如下几个问题:
Clearlove
2021/03/11
6290
Javascript模块化详解
深入理解 ES Module
Module是ES6 出现的一个新的语法,提供一种将 JavaScript 程序拆分为可按需导入的单独模块的机制。在未出现之前,我们可能使用 commonjs等模块规范。随着ES Module的普及和推广,浏览器已经支持原生的模块规范。
前端知知
2022/09/29
4340
深入理解 ES Module
【译】开始在web中使用JS Modules
原文:《Using JavaScript modules on the web》 https://developers.google.com/web/fundamentals/primers/modules 译者序 JS modules,即ES6的模块化特性,通过 <scripttype="modules">可以实现不经过打包直接在浏览器中import/export,此玩法确实让人眼前一亮。 先看看 <scripttype="modules">的兼容性。目前只有较新版本的chrome/firefox/saf
QQ音乐前端团队
2018/08/12
1.2K0
模块化的一些小研究
我们知道最常见的模块化方案有CommonJS、AMD、CMD、ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导致依赖还没加载完毕,同步的代码运行结束;CommonJS规范一般用于服务端,同步的,因为在服务器端所有文件都存储在本地的硬盘上,传输速率快而且稳定。
lhyt
2022/09/21
3320
【THE LAST TIME】深入浅出 JavaScript 模块化
随着互联网的发展,前端开发也变的越来越复杂,从一开始的表单验证到现在动不动上千上万行代码的项目开发,团队协作就是我们不可避免的工作方式,为了更好地管理功能逻辑,模块化的概念也就渐渐产生了。
Nealyang
2020/01/14
7090
【THE LAST TIME】深入浅出 JavaScript 模块化
五分钟带你回顾前端模块化发展史
CSS 早在 2.1 的版本就提出了 @import 来实现模块化,但是 JavaScript 直到 ES6 才出现官方的模块化方案 ES Module。尽管早期 JavaScript 语言规范上不支持模块化,但这并没有阻止 JavaScript 的发展。官方没有模块化标准,那么我们就自己动手创建标准。社区里的前辈们创建并实现了规范,这些规范便是前端模块化发展之路上智慧的结晶。
童欧巴
2020/03/30
8890
五分钟带你回顾前端模块化发展史
Vue学习-ES6的模块化实现
在实际编写js脚本时,可能会遇到多个js脚本中变量或函数重复命名的情况,如果全部为全局变量,则在使用的时候会产生很多麻烦。因此出现了模块化的概念,即可以把每一个js脚本当作一个独立的模块,不同模块间的内容互不干扰,这样在实际使用起来的时候会避免很多不必要的麻烦。
花猪
2022/02/17
4120
模块化的一些小研究0.前言1.script标签引入2.AMD与CMD3.CommonJS与ES64.循环依赖5.webpack是如何处理模块化的
我们知道最常见的模块化方案有CommonJS、AMD、CMD、ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导致依赖还没加载完毕,同步的代码运行结束;CommonJS规范一般用于服务端,同步的,因为在服务器端所有文件都存储在本地的硬盘上,传输速率快而且稳定。
lhyt
2018/10/31
1.3K0
50 种 ES6 模块,面试被问麻了
快来免费体验ChatGpt plus版本的,我们出的钱 体验地址:https://chat.waixingyun.cn可以加入网站底部技术群,一起找bug,...
前端小智@大迁世界
2024/02/12
1980
50 种 ES6 模块,面试被问麻了
【译】开始在web使用JS Modules
原文说的JS modules,实际上指的是ES6的模块化特性,通过<script type="module">可以实现不经过打包直接在浏览器中import/export,此玩法确实让人眼前一亮。
elson
2018/07/04
2K0
【译】开始在web使用JS Modules
[译]ES6 模块化入门
在 ES6 之前,我们已经知道了 RequireJS,AngularJS 的依赖注入,以及 CommonJS,具体可以看笔者的上一篇文章《JS模块化历史简介》。当我们学习 ES6 的模块化,就会发现它的发展深受 CommonJS 的影响。通过这篇文章,我们将看到 export 和 import 语句,以及 ES6 模块是怎么与 CommonJS 模块兼容的。
savokiss
2019/11/06
8260
【前端】:模块化 - 打包技术
ES modules export live bindings, not values, so values can be changed after they are initially imported as per.
WEBJ2EE
2020/09/01
1.5K0
【前端】:模块化 - 打包技术
javaScript模块化解析「建议收藏」
上面说提到的结构,就是模块;按照这种结构划分开发程序的过程,就是模块化开发的过程;
全栈程序员站长
2022/11/15
5040
javaScript模块化解析「建议收藏」
相关推荐
require和import的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验