因为webpack是提供打包js工具,同时她也是基于nodejs开发的,所有在webpack里面获取路径的方式,完全跟node一样,目前node提供path模块提供路径服务:我们主要从两个方面来分析路径,首先是怎么获取到当前文件路径或者当前模块的路径,然后再基于当前获得的路径用path模块根据业务做必要的操作。
深入分析一下原理:
第一步:node层面对于模块的封装.http://nodejs.cn/api/modules.html#modules_the_module_scope
在执行模块代码之前,Node.js 将使用如下所示的函数封装器对其进行封装:
(function(exports, require, module, __filename, __dirname) {
// 模块代码实际存在于此处
});
通过这样做,Node.js 实现了以下几点:
- 它将顶层变量(用
var、const或let定义)保持在模块而不是全局对象的范围内。 - 它有助于提供一些实际特定于模块的全局变量,例如:
module和exports对象,实现者可以用来从模块中导出值。- 便利变量
__filename和__dirname,包含模块的绝对文件名和目录路径。
所以在模块作用域内,我们可以方便的使用一下变量:
__dirname:当前模块的目录名。 这与 __filename 的 path.dirname() 相同。
__filename:当前模块的文件名。 这是已解析符号链接的当前模块文件的绝对路径。
对于主程序,这不一定与命令行中使用的文件名相同。
当前模块的目录名见 __dirname。
exports:导出模块。
module:对当前模块的引用。
require(id): 用于导入模块、JSON 和本地文件。 模块可以从 node_modules 导入。 可以使用相对路径(例如 ./、./foo、./bar/baz、../foo)导入本地模块和 JSON 文件,该路径将根据 __dirname(如果有定义)命名的目录或当前工作目录进行解析。 POSIX 风格的相对路径以独立于操作系统的方式解析,这意味着上面的示例将在 Windows 上以与在 Unix 系统上相同的方式工作。
require.cache:模块在需要时缓存在此对象中。
require.main :Module 对象表示 Node.js 进程启动时加载的入口脚本。
require.resolve(request[, options]):使用内部 require() 机器查找模块的位置,但不加载模块,只需返回解析的文件名。如果找不到模块,则会抛出 MODULE_NOT_FOUND 错误。
require.resolve.paths(request):如果 request 字符串引用核心模块,例如 http 或 fs,则返回包含在解析 request 或 null 期间搜索的路径的数组。
第二步:node内置模块path分析:http://nodejs.cn/api/path.html。path是处理文件和目录的路径的实用工具。
主要方法:
path.delimiter---提供特定于平台的路径定界符.
path.dirname(path)--path.dirname() 方法返回 path 的目录名.
path.extname(path)--path.extname() 方法返回 path 的扩展名,即 path 的最后一部分中从最后一次出现的 .(句点)字符到字符串的结尾。
path.format(pathObject)--path.format() 方法从对象返回路径字符串。
path.isAbsolute(path)--path.isAbsolute() 方法确定 path 是否为绝对路径。
path.join([...paths])--path.join() 方法使用特定于平台的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。
path.normalize(path)--path.normalize() 方法规范化给定的 path,解析 '..' 和 '.' 片段。
path.parse(path)--path.parse() 方法返回一个对象,其属性表示 path 的重要元素。 尾随的目录分隔符被忽略,见 path.sep。
path.relative(from, to)--path.relative() 方法根据当前工作目录返回从 from 到 to 的相对路径。 如果 from 和 to 都解析为相同的路径(在分别调用 path.resolve() 之后),则返回零长度字符串。如果零长度字符串作为 from 或 to 传入,则将使用当前工作目录而不是零长度字符串。
path.resolve([...paths])--path.resolve() 方法将路径或路径片段的序列解析为绝对路径。
path.sep--提供特定于平台的路径片段分隔符.
基于以上两步的分析,开发者可以根据路径做什么都可以啦 ~(ps:node的内置process对象也能获取到当前工作目录,process.env.PWD,或者‘./’也是当前目录哈。(注意在webpack整个配置中使用 Node 内置的 path 模块,并在它前面加上 __dirname这个全局变量。可以防止不同操作系统之间的文件路径问题,并且可以使相对路径按照预期工作。)

本文探讨了在Webpack中如何获取和处理路径,由于Webpack基于Node.js,因此其路径操作遵循Node.js的标准。重点分析了Node.js模块封装机制,特别是`__dirname`和`__filename`变量,以及`path`模块的关键方法如`join`、`normalize`和`resolve`等。通过理解这些,开发者能更自如地处理模块路径和进行相关业务操作。
1032

被折叠的 条评论
为什么被折叠?



