创建新的 React 应用程序后导入包或将其包含在 index.html 中有什么区别?

IT技术 reactjs font-awesome react-bootstrap
2021-05-11 20:14:53

当,我们在创建新的 React 应用程序时使用 create-react-app。它创建多个文件。其中 index.html 是渲染的 html 应用程序,其中根据react应用程序 App.jsx 放置了多个 jsx 元素,我很好奇导入 google 字体、bootstrap、jquery 和其他不同外部插件的最佳方法是什么?

正如我所研究的,有两种导入外部module的方法。例如。如果我们考虑从 cdn 导入的引导程序:https ://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js

然后,导入的一种方法是将其放在 public/index.html 中:

# Rest of the index.html code
<div id="root"></div>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
# Rest of the index.html code

另一种方法是使用 安装引导程序npm i bootstrap@4.3.1 --save,然后将其作为导入放在 src/index.js 中。

上面的东西可以应用到多个地方。比如说,我们必须导入 popper.min.js 或 jquery.js 或导入 css 字体。哪个更好?将它放在 index.html 中还是放在 index.js 中?另外,将它放在两个不同的地方之间的主要区别是什么?

1个回答

两种方法都具有使该库可用于您的应用程序的类似效果。

HTML 方法使您的依赖项在运行时由浏览器获取和执行。就像您img在页面上包含s一样,您可以script在带有脚本源的页面上包含s ,可以是内联的,也可以是来自其他 URI 的。因此,假设您创建了一个 HTML 页面,script在它周围放置了许多标签,然后在浏览器中点击该页面。您的浏览器将扫描 HTML 页面,识别所有script标签并开始下载它们。它也将记住其中的顺序script被发现标签,它会分析并依次执行它们(除非你使用asyncdefer属性对他们)。

好吧,浏览器看到由各种元素组成的 HTML 页面,包括一些script标签,下载它们(可能是并行的),并执行它们(顺序)。现在,这些脚本在页面上可能了解也可能不了解彼此。

现在,让我们进入依赖于各种 Javascript 库的 React 和其他丰富的 Javascript 应用程序的领域。

当您执行Javascript Module Bundlingie时,您的 Javascript 编译器import { something } from "package"会在编译获取此信息,例如当您执行时通过 create-react-app 进行 React npm run build,或 Angular 的等效脚本,或其他编译器(如 webpack 等)。这些编译器不仅会扫描单个文件,而是整个应用程序。他们通常从一个入口点开始,例如index.jsx,然后发现依赖关系图并递归地遍历他们识别的每个文件或module,并发现这些依赖关系等等。一旦编译器完成发现、解析、构建和捆绑您的应用程序,您通常最终会得到一个 Javascript 文件(例如main.[some hash].js),它是您的应用程序所有依赖项(您使用的所有其他module)imported) 捆绑在一个文件中。

所以,你看到最大的区别是:

  • HTML 脚本是浏览器在运行时下载和处理的独立资源。

  • Javascript module在编译时被发现,并最终与您的应用程序代码捆绑在一个文件中。

为了说明更大的区别,我将抛开诸如包拆分和动态引用等概念;当您进一步深入研究它们时,您最终会阅读每种方法的变化。

HTML脚本优势:

  1. 它们是独立获取的,可能是从 CDN 获取的,如果另一个网站需要它们并之前下载过它们,它们甚至可能已经缓存在您的浏览器中。所以像 jQuery、loDash 等都是可能已经下载的常见包,您的浏览器将从其内部缓存中受益。

  2. 它们可以并行下载;尽管您可以依靠浏览器来确保它们按顺序执行。因此,例如,如果您有自己的依赖于 jQuery 的脚本已经被加载,您需要做的就是<script src="jquery.min.js" />先然后然后<script src="myscript.js">这个顺序将被尊重。

Javascript module优势

  1. 您的代码可能不需要整个 jQuery、lodash 或您引用的任何其他库。通过在源代码中导入您需要的依赖项的任何函数,智能编译器可能能够巧妙地将这些函数从较大的库中剔除(摇动库),最终您将得到一个较小的整体下载有效载荷。

  2. 你的整个包可以被缩小,产生一个优化的包。

  3. 您的整个包将(/可以)在一个文件中。一次下载,您的整个应用程序已加载并可供使用。无需担心从各种 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 库。