浏览器中使用 ES 模块:现状与未来
核心要点:
- ES6 (ES2015) 引入了 JavaScript 原生模块标准,但最初浏览器支持度较差,导致开发者使用模块加载器将依赖项捆绑到单个兼容 ES5 的浏览器文件中。
- Safari、Chrome、Firefox 和 Edge 等主流浏览器现在都支持 ES6 模块的
import
语法,从而实现更高效、更规范的代码结构。 - 尽管 ES6 模块的支持度不断提高,但由于浏览器仍在不断优化,因此 Babel 和 Webpack 等构建工具目前仍不可或缺。结合 HTTP2 的多资源流传输能力和浏览器预加载功能,ES 模块有望带来显着的性能提升。
- 虽然现在可以在现代浏览器中直接使用 ES 模块,无需转译器或捆绑器,但仍建议为旧版浏览器创建单独的包。 越来越多的库开始以 ES 模块的形式发布,但它们仍然主要面向捆绑器,而非直接导入。
本文将演示如何在今天的浏览器中使用 ES 模块。
在最近之前,JavaScript 并没有模块的概念。无法直接引用或包含一个 JavaScript 文件到另一个文件中。随着应用程序规模和复杂性的增长,这使得为浏览器编写 JavaScript 变得棘手。
一种常见的解决方案是使用
// html.js export function tag (tag, text) { const el = document.createElement(tag) el.textContent = text return el }
或者作为外部脚本:
<🎜>
// app.js import { tag } from './html.js' const h1 = tag('h1', '? Hello Modules!') document.body.appendChild(h1)
type="module"
只需将
<p>
<strong></strong></p>
添加到您的
import
要求file://
npx serve
进行提取,因为它不适用于
协议。您可以使用 在当前目录中启动一个服务器以进行本地测试。 browser-es-module-loader
如果您现在大胆地在生产环境中尝试这样做,您仍然需要为旧版浏览器创建单独的包。在 中提供了一个 polyfill,它遵循规范。但是,这根本不推荐用于生产环境。
性能不要立即丢弃 Babel 和 Webpack 等构建工具,因为浏览器仍在实现优化提取的方法。尽管如此,未来使用 ES 模块仍存在性能方面的陷阱和优势。
<script> 标签在网页中加载任意脚本。但是,这会带来自身的问题。例如,每个脚本都会发起一个阻塞渲染的 HTTP 请求,这会使 JS 密集型页面感觉迟钝缓慢。依赖项管理也变得复杂,因为加载顺序很重要。 <p>ES6 (ES2015) 通过引入单一的原生模块标准在一定程度上解决了这个问题。(您可以在此处阅读有关 ES6 模块的更多信息。)但是,由于浏览器对 ES6 模块的初始支持较差,人们开始使用模块加载器将依赖项捆绑到单个兼容 ES5 的浏览器文件中。此过程会引入自身的问题和复杂性。 <p>但好消息即将到来。浏览器支持越来越好,所以让我们看看如何在今天的浏览器中使用 ES6 模块。 <p><strong>当前 ES 模块的现状 <p>Safari、Chrome、Firefox 和 Edge 都支持 ES6 模块的 <code>import 语法。它们看起来像这样: <pre class="brush:php;toolbar:false">&lt;code class=&quot;language-html&quot;&gt;&lt;script type=&quot;module&quot;&gt; import { tag } from './html.js' const h1 = tag('h1', '? Hello Modules!') document.body.appendChild(h1) &lt;/script&gt;为什么我们需要捆绑&lt;script type=&quot;module&quot; src=&quot;app.js&quot;&gt;&lt;/script&gt; &lt;script&gt; 标签中,浏览器就会将它们加载为 ES 模块。浏览器将遵循所有导入路径,每个模块仅下载和执行一次。 &lt;p&gt;&lt;img src=&quot;/static/imghwm/default1.png&quot; data-src=&quot;https://img.php.cn/upload/article/000/000/000/173958637676760.jpg?x-oss-process=image/resize,p_40&quot; class=&quot;lazy&quot; alt=&quot;Using ES Modules in the Browser Today &quot; /&gt; &lt;p&gt;旧版浏览器不会执行具有未知“type”的脚本,但您可以使用 &lt;code&gt;nomodule 属性定义回退脚本: &lt;pre class=&quot;brush:php;toolbar:false&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;script nomodule src=&quot;https://unpkg.com/browser-es-module-loader/dist/babel-browser-build.js&quot;&gt;&lt;/script&gt;今天,我们捆绑 JavaScript 以减少发出的 HTTP 请求数量,因为网络通常是加载网页速度最慢的部分。这在今天仍然是一个非常有效的问题,但未来是光明的:ES 模块结合 HTTP2 的多资源流传输能力以及浏览器预加载功能。 &lt;script nomodule src=&quot;https://unpkg.com/browser-es-module-loader&quot;&gt;&lt;/script&gt;&lt;h3 id=&quot;预加载&quot;&gt;预加载&lt;/h3&gt; &lt;p&gt;&lt;code&gt;link rel=&quot;modulepreload&quot;&lt;/code&gt; 即将出现在您附近的浏览器中。浏览器无需逐个解析所有模块导入,从而产生如下所示的网络瀑布……&lt;/p&gt; &lt;pre class='brush:php;toolbar:false;'&gt;// html.js export function tag (tag, text) { const el = document.createElement(tag) el.textContent = text return el }</pre> <pre class='brush:php;toolbar:false;'>&lt;🎜&gt;</pre> <p>您可以提前告诉浏览器页面需要 <code>html.js</code> 和 <code>lib.js</code>,从而控制瀑布:</p> <pre class='brush:php;toolbar:false;'>// app.js import { tag } from './html.js' const h1 = tag('h1', '? Hello Modules!') document.body.appendChild(h1)</pre> <h3 id="HTTP-与服务器推送">HTTP2 与服务器推送</h3> <p>与只能传输一个资源的 HTTP1.1 相比,HTTP2 能够在一个响应中推送多个资源。这将有助于最大限度地减少网络往返次数。</p> <p>在我们的示例中,可以在单个请求中传递 <code>index.html</code>、<code>app.js</code> 和 <code>html.js</code>:</p> <p>---> GET /index.html</p> <h3 id="缓存">缓存</h3> <p>传递多个较小的 ES 模块可能会使缓存受益,因为浏览器只需要提取已更改的模块。生成大型包的问题在于,如果您更改一行代码,则会使整个包失效。</p> <h3> <code>async</code>/<code>defer</code> </h3> <p>ES 模块默认情况下不会阻塞渲染,就像 <code></code></p> <p> <em>如果我们只导入需要的函数,请求数量会减少到 </em>119 个</p>:<pre class='brush:php;toolbar:false;'><🎜></pre> <p> </p>这只是一个例子,用于演示 lodash-es 尚未构建为直接在浏览器中加载。要做到这一点,您仍然需要使用 ES 模块作为目标创建自己的包。<p> <strong></strong>(此处应插入Can I Use es6-module表格)</p> <p> </p>现在是开始在浏览器中试验 ES 模块的时候了。很快,您就可以在所有现代浏览器中使用它们,而无需转译器或捆绑器(如果您愿意)。<p> <strong></strong>(此处应插入FAQ部分,内容与原文相同)</p> <script> 标签在网页中加载任意脚本。但是,这会带来自身的问题。例如,每个脚本都会发起一个阻塞渲染的 HTTP 请求,这会使 JS 密集型页面感觉迟钝缓慢。依赖项管理也变得复杂,因为加载顺序很重要。 <p>ES6 (ES2015) 通过引入单一的原生模块标准在一定程度上解决了这个问题。(您可以在此处阅读有关 ES6 模块的更多信息。)但是,由于浏览器对 ES6 模块的初始支持较差,人们开始使用模块加载器将依赖项捆绑到单个兼容 ES5 的浏览器文件中。此过程会引入自身的问题和复杂性。 <p>但好消息即将到来。浏览器支持越来越好,所以让我们看看如何在今天的浏览器中使用 ES6 模块。 <p><strong>当前 ES 模块的现状 <p>Safari、Chrome、Firefox 和 Edge 都支持 ES6 模块的 <code>import 语法。它们看起来像这样: <pre class="brush:php;toolbar:false"><code class="language-html"><script type="module"> import { tag } from './html.js' const h1 = tag('h1', '? Hello Modules!') document.body.appendChild(h1) </script>以上是今天在浏览器中使用ES模块的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript是现代网站的核心,因为它增强了网页的交互性和动态性。1)它允许在不刷新页面的情况下改变内容,2)通过DOMAPI操作网页,3)支持复杂的交互效果如动画和拖放,4)优化性能和最佳实践提高用户体验。

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),