在webpack的术语中,“webpack模块”究竟是什么? Webpack术语中的“webpack模块”是指什么?

4

我是一名Webpack的新手,目前正试图理解基本概念。 看着官方文档,在"概念"页面上使用了“模块(module)”这个术语,并给出了有关模块的更多信息的链接,该链接位于"模块"页面。

因此,在这个页面上,我们有一个问题:“什么是模块”,但没有明确的答案。相反,它通过模块如何“表达其依赖关系”来描述模块:

什么是Webpack模块

与Node.js模块不同,Webpack模块可以以多种方式表达其依赖关系。以下是一些示例:

  • ES2015的import语句

  • CommonJS的require()语句

  • AMD的define和require语句

  • css/sass/less文件中的@import语句。

  • 样式表url(...)或HTML文件中的图片URL。

因此,它并没有明确定义模块是什么,我现在很困惑。

模块只是一个JavaScript文件吗? 还是像.css或图像这样的任何类型的文件? 还是模块是一些与物理文件无关的逻辑概念?

1个回答

4

简单地回答你的问题,Webpack模块指的是被Webpack处理的Javascript文件。

至于为什么需要这样做,考虑下面这段Javascript代码:

if (window.matchMedia('(max-width: 600px)')) {
  const img = document.querySelector('#header-responsive-image');
  img.src = 'different/image/url/file.jpg';
  img.classList.add('some-class');
}

请注意,这段代码依赖于特定的标记、图像文件和CSS规则。但是至关重要的是,您必须阅读代码才能找出它们。没有(简单的)方法来静态分析这些依赖关系(甚至手动做也不行!)。
在小型应用程序中,这可能看起来并不像个大问题,但是当您处理大型JavaScript代码库或编写组件库时,能够静态分析实际的依赖关系图表,并在JS、CSS、标记和磁盘上的文件不同步时立即获得工具警告是救世主。
使用Webpack时,您将在文件的顶部看到类似于以下内容的内容:
import header600Width from '../img/header-600-width.jpg';
import '../styles/has-some-class.css';
// etc.

你可以加载图片、csv、xml、toml、json、css等等,还有其他类型。这是其他模块系统大多数情况下不能或不会做到的。因此,Webpack模块在某种程度上是Javascript模块的超集。


你可能想多提一句关于模块加载器的内容,这会更好地介绍 webpack 可以处理的内容:https://webpack.js.org/loaders/ - Silviu Burcea
在你的代码示例中,.css 和 .jpg 文件也是“webpack 模块”吗? - mlst
1
@mlst 不是的,它们是由模块导入的,Webpack会为您管理底层资源,但它们本身不是模块。 - Jared Smith
好的,最后一个问题:当模块导入CSS、JPG文件时,它们会被转换成某种JS代码或数据结构(例如,css-loader将CSS文件转换为JS数组,jpg则转换为代表图像数据的base64字符串)。现在,如果我们想要操作它们(虽然这不是很实用),但它们肯定是某种JS...那么我们可以认为它们是webpack模块吗?所以我不是在谈论CSS或JPG作为物理文件,而是它们的JS表示(例如上面的header600Width),一旦它们被导入和转换,现在是否被认为是webpack模块? - mlst
1
@mlst 我不会这样做。这取决于资产,但通常它们没有有意义的JS表示,这是抽象的一部分。例如对于图像,webpack只为您创建一个URL(作为JS字符串)。这很重要的原因是a)它使您无需自己管理服务器文件系统上路径的字符串表示:webpack将创建一个适当的路径,可以设置为img的src,并且b)所有我在答案中谈到的依赖关系图形问题。对于CSS,您不必担心链接标记和stylesheet.insertRule,webpack会处理它。 - Jared Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接