使用 webpack 解析 require 路径

IT技术 javascript webpack
2021-01-30 04:57:58

我仍然对如何使用 webpack 解析module路径感到困惑。现在我写:

myfile = require('../../mydir/myfile.js') 

但我想写

myfile = require('mydir/myfile.js') 

我在想resolve.alias可能会有所帮助,因为我看到了一个类似的例子,使用{ xyz: "/some/dir" }别名然后我可以require("xyz/file.js")

但是,如果我将别名设置为{ mydir: '/absolute/path/mydir' }require('mydir/myfile.js') 则不起作用。

我觉得自己很愚蠢,因为我已经阅读了很多次文档,但我觉得我错过了一些东西。避免使用../../etc编写所有相关要求的正确方法是什么

6个回答

网络包 >2.0

请参阅wtk 的回答

网络包 1.0

一个更直接的方法是使用resolve.root。

http://webpack.github.io/docs/configuration.html#resolve-root

解决.root

包含您的module的目录(绝对路径)。也可能是一个目录数组。此设置应用于将单个目录添加到搜索路径。

在你的情况下:

网络包配置

var path = require('path');

// ...

  resolve: {
    root: path.resolve('./mydir'),
    extensions: ['', '.js']
  }

消费module

require('myfile')

或者

require('myfile.js')

另见:http : //webpack.github.io/docs/configuration.html#resolve-modulesdirectories

如果我正确理解这一点,使用此配置将要求文件名是唯一的?
2021-03-13 04:57:58
“webpack 2 删除了除module之外的所有内容作为解析路径的一种方式。这意味着 root 将无法工作” stackoverflow.com/a/36574982/588759
2021-03-14 04:57:58
WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema. - configuration.resolve has an unknown property 'root'.
2021-03-15 04:57:58
他们应该是 - 我们可以看看你的 webpack 配置吗?
2021-04-06 04:57:58
谢谢,我试过root, modulesDirectories, 和两者的混合,但没有奏效。似乎require("mydir/file")不接受子module(例如)。
2021-04-11 04:57:58

为了将来参考,webpack 2 删除了所有内容,但modules作为解析路径的一种方式。这意味着root无法正常工作。

https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options

示例配置开始于:

{
  modules: [path.resolve(__dirname, "app"), "node_modules"]
  // (was split into `root`, `modulesDirectories` and `fallback` in the old options)
谢谢,这真的很有帮助。modulesDirectories仍然被 webpack-dev-server 使用,即使是在 webpack 2 中,这使得这非常混乱。
2021-04-07 04:57:58

resolve.alias 应该完全按照您描述的方式工作,因此我将其作为答案提供,以帮助减轻原始问题中的建议可能导致的任何混淆,即它不起作用。

如下所示的解析配置将为您提供所需的结果:

// used to resolve absolute path to project's root directory (where web pack.config.js should be located)
var path = require( 'path' );
...
{
  ...
  resolve: {
    // add alias for application code directory
    alias:{
      mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )
    },
    extensions: [ '', '.js' ]
  }
}

require( 'mydir/myfile.js' )将按预期工作。如果没有,那么肯定有其他问题。

如果您有多个module要添加到搜索路径中,这resolve.root是有道理的,但如果您只想能够在没有相对路径的情况下引用应用程序代码中的组件,这alias似乎是最直接和明确的。

的一个重要优点alias是它使您有机会为您的requires命名空间,这可以增加您的代码的清晰度;就像很容易从其他requires 中看到正在引用的module一样,alias允许您编写描述性requires 以明确您需要内部module,例如require( 'my-project/component' ). resolve.root只是将您放入所需的目录,而不会给您进一步命名它的机会。

@DimaFeldman,您的意思是 require 参数 ( require('mydir/myfile')) 中没有扩展名那应该确实有效。您可以有多个条目alias我用它从我的src目录中导入JavaScript module,另一个从我的styles目录中导入css。如果我完全误解了您的问题,请告诉我。
2021-03-17 04:57:58
@DimaFeldman 抱歉,我不熟悉您所描述的行为;所以如果我只是对某些已知功能一无所知(我找不到它的文档),请原谅我。我想知道您的配置中是否有一些加载程序可以通过仅指定其位置(而不是其文件名)来提供导入module的能力?对不起,我没有帮助...最好在包含您的配置文件的情况下提出一个新问题。
2021-03-25 04:57:58
@sethro 你是对的,让我重新表述我的问题 - 我的意思是:我有一个目录,比如说 Component1,在这个目录中我有一个名为 Component1.js 的文件。在使用别名之前,我可以通过调用导入文件import './path/to/Component1';- 只需在路径中没有内部文件名和扩展名。webpack 以某种方式设法检测到内部文件具有目录的名称,然后将其导入。现在我想做的是像这样导入它:import 'shared\Component1';当“共享”是别名时。但如果不指定内部文件名,它就不起作用。谢谢!
2021-03-28 04:57:58
任何提示如何调整此解决方案以支持没有文件扩展名的子目录导入?@sethro
2021-04-03 04:57:58
我喜欢给波浪号取别名: alias: {'~': path.resolve(__dirname)},
2021-04-12 04:57:58

万一其他人遇到这个问题,我能够让它像这样工作:

var path = require('path');
// ...
resolve: {
  root: [path.resolve(__dirname, 'src'), path.resolve(__dirname, 'node_modules')],
  extensions: ['', '.js']
};

我的目录结构是:

.
├── dist
├── node_modules
├── package.json
├── README.md
├── src
│   ├── components
│   ├── index.html
│   ├── main.js
│   └── styles
├── webpack.config.js

然后从src目录中的任何地方我可以调用:

import MyComponent from 'components/MyComponent';
@spencer.sm 如果我只想从当前项目解析module怎么办?我有几个相互导入的项目。如果 projectA 从 projectB 导入 fileA,并且 fileA 导入lodash,我只想lodashprojectA/node_modules. 这就是resolve.modules: [path.resolve(__dirname, 'node_modules')]有用的。但是,我遇到了像您说的子依赖项的问题。除了将 node_modules 解析限制为 之外,有没有办法告诉 webpack 还可以找到子依赖项projectA/node_modules
2021-03-22 04:57:58
@spencer.sm 谢谢!经过很多努力,最终您的解决方案解决了我的子依赖问题:D
2021-04-05 04:57:58
使用 path.resolve 解析 node_modules 不好。这可能会导致子依赖问题。请改用字符串'node_modules'[ path.resolve(__dirname, 'src'), 'node_modules' ],
2021-04-12 04:57:58

我最头疼的是在没有命名空间路径的情况下工作。像这样的东西:

./src/app.js
./src/ui/menu.js
./node_modules/lodash/

在我用来设置我的环境来执行此操作之前:

require('app.js')
require('ui/menu')
require('lodash')

我发现避免src隐藏重要上下文信息的隐式路径要方便得多

我的目标是要求这样的:

require('src/app.js')
require('src/ui/menu')
require('test/helpers/auth')
require('lodash')

如您所见,我所有的应用程序代码都位于一个强制路径命名空间中。这很清楚哪个 require 调用需要库、应用程序代码或测试文件。

为此,我确保我的解析路径只是node_modules当前的应用程序文件夹,除非您在源文件夹中命名您的应用程序,例如src/my_app

这是我使用 webpack 的默认设置

resolve: {
  extensions: ['', '.jsx', '.js', '.json'],
  root: path.resolve(__dirname),
  modulesDirectories: ['node_modules']
}

如果您将环境变量设置为NODE_PATH当前项目文件,那就更好了这是一个更通用的解决方案,如果你想在没有 webpack 的情况下使用其他工具,它会有所帮助:测试、linting ......