两种方法都具有使该库可用于您的应用程序的类似效果。
HTML 方法使您的依赖项在运行时由浏览器获取和执行。就像您img
在页面上包含s一样,您可以script
在带有脚本源的页面上包含s ,可以是内联的,也可以是来自其他 URI 的。因此,假设您创建了一个 HTML 页面,script
在它周围放置了许多标签,然后在浏览器中点击该页面。您的浏览器将扫描 HTML 页面,识别所有script
标签并开始下载它们。它也将记住其中的顺序script
被发现标签,它会分析并依次执行它们(除非你使用async
和defer
属性对他们)。
好吧,浏览器看到由各种元素组成的 HTML 页面,包括一些script
标签,下载它们(可能是并行的),并执行它们(顺序)。现在,这些脚本在页面上可能了解也可能不了解彼此。
现在,让我们进入依赖于各种 Javascript 库的 React 和其他丰富的 Javascript 应用程序的领域。
当您执行Javascript Module Bundling
ie时,您的 Javascript 编译器import { something } from "package"
会在编译时获取此信息,例如当您执行时通过 create-react-app 进行 React npm run build
,或 Angular 的等效脚本,或其他编译器(如 webpack 等)。这些编译器不仅会扫描单个文件,而是整个应用程序。他们通常从一个入口点开始,例如index.jsx
,然后发现依赖关系图并递归地遍历他们识别的每个文件或module,并发现这些依赖关系等等。一旦编译器完成发现、解析、构建和捆绑您的应用程序,您通常最终会得到一个 Javascript 文件(例如main.[some hash].js
),它是您的应用程序和所有依赖项(您使用的所有其他module)import
ed) 捆绑在一个文件中。
所以,你看到最大的区别是:
为了说明更大的区别,我将抛开诸如包拆分和动态引用等概念;当您进一步深入研究它们时,您最终会阅读每种方法的变化。
HTML脚本优势:
它们是独立获取的,可能是从 CDN 获取的,如果另一个网站需要它们并之前下载过它们,它们甚至可能已经缓存在您的浏览器中。所以像 jQuery、loDash 等都是可能已经下载的常见包,您的浏览器将从其内部缓存中受益。
它们可以并行下载;尽管您可以依靠浏览器来确保它们按顺序执行。因此,例如,如果您有自己的依赖于 jQuery 的脚本已经被加载,您需要做的就是<script src="jquery.min.js" />
先然后然后<script src="myscript.js">
这个顺序将被尊重。
Javascript module优势
您的代码可能不需要整个 jQuery、lodash 或您引用的任何其他库。通过在源代码中导入您需要的依赖项的任何函数,智能编译器可能能够巧妙地将这些函数从较大的库中剔除(摇动库),最终您将得到一个较小的整体下载有效载荷。
你的整个包可以被缩小,产生一个优化的包。
您的整个包将(/可以)在一个文件中。一次下载,您的整个应用程序已加载并可供使用。无需担心从各种 URL 下载各种资源。
混合方法没问题
随意使用混合解决方案!如果你检查你编译的 React 代码,你会看到create-react-app
编译器会<script src="static/js/main.js" /> element at the end of your HTML document. This means that your app can rely on other
在你的 HTML 文档中注入一个包含更高层的`s。所以,可以随意加载一些 HTML 库,并通过 JS module引用其他库。事实上,有些情况下您会想要这样做;例如,可以通过 HTML 脚本指令轻松地包含 Google Maps 脚本,并且您的 React 应用程序仍然可以使用 GMaps 库。