直接引用node_modules可以吗?

Is it ok to refer to node_modules directly?

我目前正在处理的项目 (Java/JSP) 目前没有使用包管理器来管理其 JavaScript 依赖项。

所使用的库只是在版本控制下提交,并从 JSP 页中引用...

如果我们使用包管理器(例如 yarn),我想发展成一个工作流程,后来最终也会 webpack 进一步优化构建。

我想分阶段进行。由于我对这种 前端工作流程 几乎没有 none 经验,所以我有一些问题:

  1. 如果只在 package.json 文件中定义使用的库,然后使用 yarn 来管理打包,会不会很奇怪?

yarn 将获取模块并将它们存储在 node_modules 文件夹中。

  1. 直接从 JSP 文件中引用 node_modules 文件夹中的脚本是不好的做法吗?

例子

package.json:

"dependencies": {
    "jquery": "^3.4.1"
}

app.jsp:

<script src="node_modules/jquery/dist/jquery.min.js"></script>

NPM 包旨在 运行 与 Node 一起使用,而不是在浏览器中。您需要提供浏览器友好的版本,使用 webpack 或 browserify 之类的东西。

  1. 是的,完全可以。这是我们通常初始化前端项目的方式(可能有时,一些更高级别的脚本会为我们完成,但仍然如此)。就 运行 npm init.

  2. 哦,是的,这很糟糕。很可能,它根本行不通。如果想在页面直接加载东西,需要cdn版本。

老实说,如果没有像 webpack、gulp 或 g运行t 这样的构建工具,拥有 package.json 并没有那么有用。

UPD: 关于 为什么 直接从 node_modules 加载东西可能会造成伤害:

许多现代 JS 包(例如 React)使用尚未在任何浏览器中实现的 modules 或仅受某些浏览器支持的 ES5+ 语法。

这样,您可以直接加载 React,但它会在任何浏览器中崩溃,如 import is not defined

基本上,很多 现代软件包都希望您拥有构建工具或使用 cdn 版本。

老实说,我不知道有多少包可以让你直接从 node_modules 无缝加载东西。

因此,在您的特定情况下,我想说的是,如果您使用的特定软件包允许您这样做并且附带浏览器兼容版本,您可以继续这样做。

尽管如此,我认为您迟早会遇到一个不会让您以这种方式包含它(或更糟:它会,但会使一些不支持最新 JS 的浏览器崩溃 features/introduce 您的应用程序中的其他讨厌的错误)。

希望在此阶段,您已经配置了构建工具。

奖金: 最近一些浏览器开始 support modules!

甚至还有像 snowpack 这样的工具,它们的功能与您正在寻找的东西特别相似。

尽管如此,您仍然需要非常小心。例如,直接包含 lodash.js 将生成 640 个 GET(查看 this article -> "Libraries" 部分)。