webpack으로 필요한 경로 해결


164

나는 여전히 webpack으로 모듈 경로를 해결하는 방법을 혼동하고 있습니다. 이제 나는 쓴다 :

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

하지만 쓰고 싶습니다

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

alias . 로 사용하는 비슷한 예제를 볼 수 있기 때문에 resolve.alias 가 도움이 될 수 있다고 생각했습니다 .{ xyz: "/some/dir" }require("xyz/file.js")

나는 내 별칭을 설정하지만 { mydir: '/absolute/path/mydir' }, require('mydir/myfile.js') 작업은하지 않습니다.

문서를 여러 번 읽었으므로 뭔가 바보 같은 느낌이 듭니다. 친척이 필요로하는 모든 것을 쓰는 것을 피하는 올바른 방법은 무엇입니까 ../../?


resolve.alias당신이 제안한대로 정확하게 작동합니다. resolve구성에 다른 이유로 인해 실패했는지 궁금 합니다. 나는 잘 사용 alias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )하고 require( 'mydir/myfile.js' )잘 작동합니다.
sethro

답변:


142

웹팩> 2.0

wtk의 답변을 참조하십시오 .

웹팩 1.0

이를 수행하는보다 간단한 방법은 resolve.root를 사용하는 것입니다.

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

resolve.root

모듈이 포함 된 디렉토리 (절대 경로). 디렉토리 배열 일 수도 있습니다. 이 설정은 개별 디렉토리를 검색 경로에 추가하는 데 사용해야합니다.

귀하의 경우 :

웹팩 설정

var path = require('path');

// ...

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

소비 모듈

require('myfile')

또는

require('myfile.js')

참조 : http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories


1
감사합니다, 나는 노력 root, modulesDirectories그리고이 둘의 혼합, 그러나 그것은 작동하지 않았다. 하위 모듈 (예 :) require("mydir/file")은 허용되지 않는 것 같습니다 .
gpbl

웹팩 설정을 볼 수 있습니까?
Jeff Ling

1
이것을 올바르게 이해하고 있다면이 구성을 사용하려면 파일 이름이 고유해야합니까?
Jonny

1
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'.
Tomáš Zato-복원 모니카

1
"webpack 2는 경로를 해결하는 방법으로 모듈을 제외한 모든 것을 제거했습니다. 이것은 루트가 작동하지 않음을 의미합니다" stackoverflow.com/a/36574982/588759
rofrol

72

나중에 참조하기 위해 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)

4
고마워, 이것은 정말 도움이됩니다. modulesDirectorieswebpack-dev-server, webpack 2에서도 여전히 사용되므로 혼란 스럽습니다.
Evan

63

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' )예상대로 작동합니다. 그렇지 않은 경우 다른 문제가 있어야합니다.

검색 경로에 추가하려는 모듈이 여러 개인 경우에는 resolve.root의미가 있지만 상대 경로없이 응용 프로그램 코드 내에서 구성 요소를 참조하려는 경우 alias가장 간단하고 명시적인 것 같습니다.

중요한 장점은 코드에 명확성을 추가 할 수있는 alias네임 스페이스 require를 만들 수 있다는 것입니다. 다른 require모듈에서 참조되는 모듈을 쉽게 볼 수 있듯이 내부 모듈이 필요하다는 것을 분명히하는 alias설명을 작성할 수 있습니다 ( require예 :) require( 'my-project/component' ). resolve.root네임 스페이스를 만들 수있는 기회를주지 않으면 서 원하는 디렉토리로 이동합니다.


46
물결표의 별칭을 지정하고 싶습니다 :alias: {'~': path.resolve(__dirname)},
Daniel Buckmaster

파일 확장자없이 하위 디렉토리 가져 오기를 지원하도록이 솔루션을 조정하는 방법에 대한 힌트가 있습니까? @sethro
Dima Feldman

@DimaFeldman, require 인수 ( require('mydir/myfile'))에 확장이 없음을 의미 합니까? 실제로 작동합니다. alias;에 여러 항목이있을 수 있습니다 . 내에서 가져올 것을 사용 src내에서 수입에 자바 스크립트 모듈 디렉토리와 다른 stylesCSS를위한 디렉토리. 귀하의 질문을 완전히 오해 한 경우 알려주십시오.
sethro

@ sethro 당신이 옳습니다. 내 질문을 다시 말하겠습니다. 내가 의미하는 것은 : Component1이라고하는 디렉토리가 있고이 디렉토리 안에는 Component1.js라는 파일이 있습니다. 별칭을 사용하기 전에 import './path/to/Component1';경로의 내부 파일 이름 및 확장자없이 단순히 호출하여 파일을 가져올 수 있습니다. webpack은 어떻게 든 내부 파일의 디렉토리 이름이 있음을 감지하고 방금 가져 왔습니다. 이제 내가하고 싶은 것은 다음과 같이 가져 오는 것입니다 : import 'shared\Component1';'shared'가 별칭입니다. 내부 파일 이름을 지정하지 않으면 작동하지 않습니다. 감사!
Dima Feldman 2016 년

1
@DimaFeldman 죄송합니다. 설명하신 동작에 익숙하지 않습니다. 알려진 기능을 모르는 경우 용서해야합니다 (문서를 찾을 수 없음). 설정에 로더 (파일 이름이 아닌 위치 만 지정하여 모듈을 가져올 수있는 기능을 제공하는 로더)가 있는지 궁금합니다. 죄송합니다. 도움이되지 않습니다 ... 구성 파일이 포함 된 새로운 질문을하는 것이 가장 좋습니다.
sethro

13

다른 사람 이이 문제에 부딪 치면 다음과 같이 작동시킬 수있었습니다.

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';

2
path.resolve를 사용하여 node_modules를 해결하는 것은 좋지 않습니다. 하위 종속성에 문제가 발생할 수 있습니다. 'node_modules'대신 문자열을 사용하십시오 . [ path.resolve(__dirname, 'src'), 'node_modules' ],
spencer.sm

@ spencer.sm 현재 프로젝트에서 모듈 만 해결하려면 어떻게해야합니까? 서로 가져 오는 몇 가지 프로젝트가 있습니다. projectA가 projectB에서 fileA를 가져오고 fileA가 imports 인 lodash경우 lodash에만 확인 하고 싶습니다 projectA/node_modules. 이것이 resolve.modules: [path.resolve(__dirname, 'node_modules')]유용한 것입니다. 그러나 나는 당신이 말한 것처럼 하위 종속성에 문제가 있습니다. node_modules 해상도를 제한하는 것 외에도 하위 종속성을 찾도록 webpack에 지시하는 방법이 projectA/node_modules있습니까?
Eric Guan

@ spencer.sm 감사합니다! D : 투쟁의 많은 후, 마지막으로 솔루션 내 하위 종속성 문제 해결
사드 압둘라

5

가장 큰 두통은 네임 스페이스 경로없이 일하고있었습니다. 이 같은:

./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')

보시다시피, 모든 앱 코드는 필수 경로 네임 스페이스 내에 있습니다. 이것은 호출이 라이브러리, 앱 코드 또는 테스트 파일을 필요로한다는 것을 분명히합니다.

이를 node_modules위해 소스 폴더 안에 앱의 네임 스페이스를 지정하지 않는 한 내 해결 경로가 현재 앱 폴더 인지 확인하고src/my_app

이것은 webpack의 내 기본값입니다.

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

환경 변수 NODE_PATH를 현재 프로젝트 파일로 설정하면 더 좋습니다 . 이것은보다 보편적 인 솔루션이며 웹 팩없이 다른 도구를 사용하려면 테스트, 보푸라기 ...


3

다음과 같이 Webpack 2로 해결했습니다.

module.exports = {
  resolve: {
    modules: ["mydir", "node_modules"]    
  }
}

배열에 디렉토리를 더 추가 할 수 있습니다 ...


절대 경로와 상대 경로는 동일하게 처리되지 않습니다. 빌드 시간에 영향을 줄 수 있습니다 webpack.js.org/configuration/resolve/#resolve-modules을
TeChn4K

1
두 경우 모두 작동하지만 상대 경로로 빌드하는 데 시간이 오래 걸릴 수 있습니다.
TeChn4K

3

Webpack 2를 사용 하여이 문제를 해결했습니다.

   resolve: {
      extensions: ['', '.js'],
        modules: [__dirname , 'node_modules']
    }


1

이 스레드는 오래되었지만 require.context에 대해 아무도 게시하지 않았으므로 언급 할 것입니다.

require.context를 사용하여 폴더가 다음과 같이 보이도록 설정할 수 있습니다.

var req = require.context('../../mydir/', true)
// true here is for use subdirectories, you can also specify regex as third param

return req('./myfile.js')

0

누구든지 myDir의 부모 디렉토리를 webpack의 modulesDirectories에 포함하도록 제안한 이유를 얻지 못했습니다.

resolve: {
    modulesDirectories: [
      'parentDir',
      'node_modules',
    ],
    extensions: ['', '.js', '.jsx']
  },

0

간단히 babel-plugin-module-resolver를 사용하십시오 .

$ npm i babel-plugin-module-resolver --save-dev

그런 다음 .babelrc아직 파일이 없다면 루트 아래 에 파일을 만드십시오 .

{
    "plugins": [
        [
            "module-resolver",
            {
                "root": ["./"]
            }
        ]
    ]
}

그리고 루트 아래의 모든 것은 절대 수입으로 취급됩니다 :

import { Layout } from 'components'

VSCode / Eslint 지원에 대해서는 여기를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.