为什么 webpack 的入口点使用相对路径而输出 属性 中使用绝对路径?
Why relative path is used in entry point and absolute path in output property of webpack?
最近开始学习如何配置与 Webpack 模块捆绑器的反应。下面的代码是我到目前为止配置的一个简单代码。我从 Webpack.
的官方文档中获取了这段代码
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
},
};
我知道入口点是 webpack 开始打包过程的地方,输出告诉在哪里发出 webpack 创建的打包文件。
但是这里我很困惑为什么我们需要在入口路径中有一个相对路径而在输出路径中有一个绝对路径?
我试图从官方文档中搜索此信息,但没有找到任何参考资料。
入口路径没有必要是相对的。它也可以是绝对路径,因为幕后发生的事情是 custom join operation:
const join = (rootPath, request) => {
if (!request) return normalize(rootPath);
const requestType = getType(request);
switch (requestType) {
case PathType.AbsolutePosix:
return posixNormalize(request);
case PathType.AbsoluteWin:
return winNormalize(request);
}
switch (getType(rootPath)) {
case PathType.Normal:
case PathType.Relative:
case PathType.AbsolutePosix:
return posixNormalize(`${rootPath}/${request}`);
case PathType.AbsoluteWin:
return winNormalize(`${rootPath}\${request}`);
}
/* ... */
};
因此,如果 rootPath
和 request
都是绝对值,那么将返回 request
的规范化版本。归一化是通过Node.js'normalize
函数实现的(也依赖于环境,但作用相同)
The path.normalize() method normalizes the given path, resolving '..' and '.' segments.
然而,如果request
不是绝对的,那么显然它是相对的,连接操作的结果将是规范化rootPath
和[=14=组合后的结果路径].
现在让我们澄清一下 rootPath
和 request
是什么。默认情况下,rootPath
指向当前工作目录,因为它指的是 options.context
的 默认值 ,即 process.cwd()
。因此,rootPath
指的是当前工作目录。
另一方面,简而言之,request
指的是您在代码段中为 entry
选项提供的路径。
也许一个例子可以说明这一点。假设我有一个名为 understanding-webpack
的存储库(实际上我有一个 here)。如果你克隆它,默认情况下 rootPath
将指向 home/user/Documents/understanding-webpack
。如果 entry
的值为 src/foo.js
,则 规范化路径 将为 home/user/Documents/understanding-webpack/src/foo.js
.
但是,如前所述,entry
的值也可以是 绝对路径。您可以提供这样的绝对路径:
const config = {
/* ... */
entry: path.join(__dirname, 'src'),
/* ... */
}
现在,正如我们所见,request
的规范化版本将被返回(即 path.join(__dirname, 'src')
)。
当目录结构不常见时,提供绝对路径很有用,例如
- src
- index.js
- webpack.config.js
例如,在the repo I was referring to earlier中,webpack配置文件在examples
目录中。因此,每个 entry
值都是绝对值,否则生成的路径将始终为 /home/user/Documents/understanding-webpack/src/index.js
。这是不需要的,因为 examples
部分不存在。
加入操作发生在here,在JoinRequestPlugin
。
最近开始学习如何配置与 Webpack 模块捆绑器的反应。下面的代码是我到目前为止配置的一个简单代码。我从 Webpack.
的官方文档中获取了这段代码const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
},
};
我知道入口点是 webpack 开始打包过程的地方,输出告诉在哪里发出 webpack 创建的打包文件。
但是这里我很困惑为什么我们需要在入口路径中有一个相对路径而在输出路径中有一个绝对路径?
我试图从官方文档中搜索此信息,但没有找到任何参考资料。
入口路径没有必要是相对的。它也可以是绝对路径,因为幕后发生的事情是 custom join operation:
const join = (rootPath, request) => {
if (!request) return normalize(rootPath);
const requestType = getType(request);
switch (requestType) {
case PathType.AbsolutePosix:
return posixNormalize(request);
case PathType.AbsoluteWin:
return winNormalize(request);
}
switch (getType(rootPath)) {
case PathType.Normal:
case PathType.Relative:
case PathType.AbsolutePosix:
return posixNormalize(`${rootPath}/${request}`);
case PathType.AbsoluteWin:
return winNormalize(`${rootPath}\${request}`);
}
/* ... */
};
因此,如果 rootPath
和 request
都是绝对值,那么将返回 request
的规范化版本。归一化是通过Node.js'normalize
函数实现的(也依赖于环境,但作用相同)
The path.normalize() method normalizes the given path, resolving '..' and '.' segments.
然而,如果request
不是绝对的,那么显然它是相对的,连接操作的结果将是规范化rootPath
和[=14=组合后的结果路径].
现在让我们澄清一下 rootPath
和 request
是什么。默认情况下,rootPath
指向当前工作目录,因为它指的是 options.context
的 默认值 ,即 process.cwd()
。因此,rootPath
指的是当前工作目录。
另一方面,简而言之,request
指的是您在代码段中为 entry
选项提供的路径。
也许一个例子可以说明这一点。假设我有一个名为 understanding-webpack
的存储库(实际上我有一个 here)。如果你克隆它,默认情况下 rootPath
将指向 home/user/Documents/understanding-webpack
。如果 entry
的值为 src/foo.js
,则 规范化路径 将为 home/user/Documents/understanding-webpack/src/foo.js
.
但是,如前所述,entry
的值也可以是 绝对路径。您可以提供这样的绝对路径:
const config = {
/* ... */
entry: path.join(__dirname, 'src'),
/* ... */
}
现在,正如我们所见,request
的规范化版本将被返回(即 path.join(__dirname, 'src')
)。
当目录结构不常见时,提供绝对路径很有用,例如
- src
- index.js
- webpack.config.js
例如,在the repo I was referring to earlier中,webpack配置文件在examples
目录中。因此,每个 entry
值都是绝对值,否则生成的路径将始终为 /home/user/Documents/understanding-webpack/src/index.js
。这是不需要的,因为 examples
部分不存在。
加入操作发生在here,在JoinRequestPlugin
。