Programing

node.js를 절대적으로 요구하는 방법?

lottogame 2020. 4. 24. 08:01
반응형

node.js를 절대적으로 요구하는 방법? (상대가 아닌)


현재 모듈이 아닌 프로젝트의 루트에 따라 항상 파일을 요구하고 싶습니다.

예를 들어 https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js 6 번 줄을 보면

express = require('../../')

정말 나쁜 IMO입니다. 모든 예제를 한 수준 만 루트에 더 가까이두고 싶다고 상상해보십시오. 각 예제에서 30 개 이상의 예제를 여러 번 업데이트해야하기 때문에 불가능합니다. 이에:

express = require('../')

내 솔루션은 루트 기반의 특별한 경우를 갖는 것입니다. 문자열이 $로 시작하면 프로젝트의 루트 폴더와 관련이 있습니다.

도움을 주셔서 감사합니다

업데이트 2

이제 require.js를 사용하여 한 가지 방식으로 작성하고 클라이언트와 서버에서 모두 작동합니다. Require.js를 사용하면 사용자 지정 경로를 만들 수도 있습니다 .-«

업데이트 3

이제 webpack + gulp로 이동했으며 서버 측에서 모듈을 처리하기 위해 강화 요구 사항을 사용합니다. 근거를 여기에서보십시오 : http://hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/


그리고 어떻습니까 :

var myModule = require.main.require('./path/to/module');

기본 js 파일에서 필요한 것처럼 파일이 필요하므로 기본 js 파일이 프로젝트의 루트에있는 한 꽤 잘 작동합니다 ... 그것이 고맙습니다.


Browserify 핸드북 에는 정말 흥미로운 섹션이 있습니다 .

../../../../../../ .. 피하기

응용 프로그램의 모든 것이 공용 npm에 올바르게 속하는 것은 아니며 개인 npm 또는 git repo 설정의 오버 헤드는 여전히 많습니다. ../../../../../../../상대 경로 문제 를 피하기위한 몇 가지 방법이 있습니다.

node_modules

사람들은 때때로 npm에서 타사 모듈을 체크인하지 않고 내부 모듈을 체크인하는 방법이 명확하지 않기 때문에 애플리케이션 특정 모듈을 node_modules에 넣는 것에 반대합니다.

대답은 매우 간단합니다! .gitignore무시 하는 파일 이있는 경우 node_modules:

node_modules

!내부 애플리케이션 모듈 각각에 대해 예외를 추가 할 수 있습니다 .

node_modules/*
!node_modules/foo
!node_modules/bar

당신은 할 수 있습니다 무시 안함 하위 디렉토리, 부모가 이미 무시할 경우. 그래서 그 대신 무시 node_modules, 당신은 모든 디렉토리 무시해야 내부 node_modulesnode_modules/*트릭을, 그리고 당신은 당신의 예외를 추가 할 수 있습니다.

이제 어디에서나 응용 프로그램에서 당신은 수있을 것 require('foo')또는 require('bar')매우 크고 깨지기 쉬운 상대 경로를하지 않고.

많은 모듈이 있고 npm에 의해 설치된 타사 모듈과 더 별도로 유지하려면 다음 node_modules과 같은 디렉토리에 모두 넣을 수 있습니다 node_modules/app.

node_modules/app/foo
node_modules/app/bar

이제 응용 프로그램의 어느 곳에서든 require('app/foo')또는 require('app/bar')어디서나 가능합니다.

에서 다음 .gitignore에 대한 예외를 추가하십시오 node_modules/app.

node_modules/*
!node_modules/app

애플리케이션에 package.json에 변환이 구성된 경우 변환은 모듈 경계에 적용되지 않기 때문에 node_modules/foo또는 node_modules/app/foo컴포넌트 디렉토리 에 자체 변환 필드를 사용하여 별도의 package.json을 작성해야 합니다. 이렇게하면 응용 프로그램의 구성 변경에 대해 모듈이 더욱 강력 해지며 응용 프로그램 외부에서 패키지를 독립적으로 재사용하기가 더 쉬워집니다.

심볼릭 링크

심볼릭 링크를 만들 수 있고 창을 지원할 필요가없는 응용 프로그램에서 작업하는 경우 유용한 또 다른 방법은 a lib/또는 app/폴더 를에 심볼릭 링크하는 것 node_modules입니다. 프로젝트 루트에서 다음을 수행하십시오.

ln -s ../lib node_modules/app

이제 프로젝트에서 어디에서 당신의 파일을 필요로 할 수 있습니다 lib/수행하여 require('app/foo.js')얻을 lib/foo.js.

맞춤 경로

$NODE_PATH환경 변수 사용에 대해 이야기 하거나 opts.pathsnode 및 browserify에 대한 디렉토리를 추가하여 모듈을 찾기 위해 어떤 장소를 이야기하는 것을 볼 수 있습니다 .

대부분의 다른 플랫폼과 달리 경로 디렉토리의 쉘 스타일 배열을 $NODE_PATH사용하면 node_modules디렉토리를 효과적으로 사용하는 것보다 노드에서 유리하지 않습니다 .

응용 프로그램이 런타임 환경 구성에 더 밀접하게 연결되어 있기 때문에 더 많은 부품이 이동하고 환경이 올바르게 설정된 경우에만 응용 프로그램이 작동하기 때문입니다.

노드와 브라우저는 모두 지원하지만 사용을 권장하지 않습니다 $NODE_PATH.


node_modules공유 코드를위한 폴더 를 만들고 노드를 만들고 가장 잘하는 것을 요구합니다.

예를 들면 다음과 같습니다.

- node_modules // => these are loaded from your package.json
- app
  - node_modules // => add node-style modules
    - helper.js
  - models
    - user
    - car
- package.json
- .gitignore

예를 들어, 당신이 있다면 car/index.jsrequire('helper')있고 노드는 그것을 찾을 것입니다!

node_modules 작동 방식

노드에는 경쟁 플랫폼 중에서 고유 한 모듈을 해결하기위한 영리한 알고리즘이 있습니다.

당신이 경우 require('./foo.js')에서 /beep/boop/bar.js, 노드를 찾습니다 ./foo.js에서 /beep/boop/foo.js. ./또는 ../시작하는 경로 는 항상 호출하는 파일의 로컬 경로입니다 require().

그러나 require('xyz')from 과 같이 상대적이지 않은 이름이 필요한 경우 /beep/boop/foo.js노드는 이러한 경로를 순서대로 검색하여 첫 번째 일치시 중지하고 아무것도 발견되지 않으면 오류를 발생시킵니다.

/beep/boop/node_modules/xyz
/beep/node_modules/xyz
/node_modules/xyz

xyz존재하는 디렉토리에 대해 노드는 먼저 필드가 존재 xyz/package.json하는지 확인 하기 위해 a 찾습니다 "main". "main"필드는 require()디렉토리 경로 인 경우 어떤 파일을 담당해야하는지 정의 합니다.

예를 들어, if /beep/node_modules/xyz가 첫 번째 일치이며 다음을 /beep/node_modules/xyz/package.json갖습니다.

{
  "name": "xyz",
  "version": "1.2.3",
  "main": "lib/abc.js"
}

에서의 내보내기는에서 /beep/node_modules/xyz/lib/abc.js반환됩니다 require('xyz').

어떤이없는 경우 package.json또는 전혀 "main"필드, index.js가정한다 :

/beep/node_modules/xyz/index.js

큰 그림

"정말 나쁘다"지만 시간을 줘. 사실 정말 좋습니다. 명시 적 기능 require()은 프로젝트 수명주기 동안 신선한 공기를 마실 때와 같이 완전히 투명하고 이해하기 쉽습니다.

다음과 같이 생각하십시오. 예를 읽고 발가락을 Node.js에 담그고 "실제로 나쁜 IMO"라고 결정했습니다. Node.js 커뮤니티의 리더는 누구보다 Node.js 애플리케이션을 작성하고 유지 보수하는 데 더 많은 시간을 투자 한 사람들입니다. 저자가 신참 실수를했을 가능성은 무엇입니까? (그리고 나는 루비와 파이썬 배경에서 처음에는 재앙처럼 보인다는 것에 동의합니다.)

Node.js를 둘러싼 과대 광고 및 대대 광고가 많이 있습니다. 그러나 먼지가 쌓이면 명시 적 모듈과 "로컬 우선"패키지가 채택의 주요 동인임을 인정할 것입니다.

일반적인 경우

물론 node_modules현재 디렉토리에서 부모, 조부모, 증조부모 등이 검색됩니다. 따라서 설치 한 패키지는 이미 이런 식으로 작동합니다. 일반적으로 require("express")프로젝트의 어느 곳에서나 할 수 있으며 정상적으로 작동합니다.

프로젝트의 루트에서 공통 파일을로드하는 경우 (아마도 공통 유틸리티 기능이기 때문에) 패키지를 만들어야 할 때가 될 것입니다. 패키지는 매우 간단합니다. 파일을 옮기고 거기에 node_modules/넣으십시오 package.json. 짜잔! 해당 네임 스페이스의 모든 내용은 전체 프로젝트에서 액세스 할 수 있습니다. 패키지는 코드를 전역 네임 스페이스로 가져 오는 올바른 방법입니다.

다른 해결 방법

나는 개인적으로 이러한 기술을 사용하지 않지만 그들은 당신의 질문에 대답합니다.

$NODE_PATH프로젝트 루트로 설정할 수 있습니다 . 해당 디렉토리는 검색 할 때 검색됩니다 require().

다음으로 모든 예제에서 공통 로컬 파일을 손상시키고 요구할 수 있습니다. 이 공통 파일은 단순히 조부모 디렉토리에서 실제 파일을 다시 내 보냅니다.

examples / downloads / app.js (그리고 다른 많은 것들)

var express = require('./express')

예제 / 다운로드 /express.js

module.exports = require('../../')

이제 해당 파일을 재배치 할 때 최악의 경우 하나의 모듈을 수정하는 것 입니다.


node-rfr을 살펴보십시오 .

다음과 같이 간단합니다.

var rfr = require('rfr');
var myModule = rfr('projectSubDir/myModule');

IMHO의 가장 쉬운 방법은 GLOBAL객체의 일부로 자신의 기능을 정의하는 것 입니다. projRequire.js다음 내용으로 프로젝트의 루트에 작성하십시오 .

var projectDir = __dirname;

module.exports = GLOBAL.projRequire = function(module) {
  return require(projectDir + module);
}

require프로젝트 특정 모듈을 사용 하기 전에 기본 파일에서 :

// init projRequire
require('./projRequire');

그 후 다음이 저에게 효과적입니다.

// main file
projRequire('/lib/lol');

// index.js at projectDir/lib/lol/index.js
console.log('Ok');


@ 토티, 나는 당신이 의견에 설명 된 경우에 작동 할 수있는 다른 솔루션을 생각해 냈습니다. 설명 할거야 tl;dr내가 더 잘와 사진을 보여, 그래서 내 테스트 프로젝트의 구조를 .


process.cwd()내 프로젝트에 사용 합니다. 예를 들면 다음과 같습니다.

var Foo = require(process.cwd() + '/common/foo.js');

require아직이 문제 직면하지는 않았지만 이것이 절대 경로를 초래할 것이라는 점에 주목할 가치가 있습니다 .


이 문제에 대한 좋은 토론이 여기에 있습니다 .

나는 동일한 아키텍처 문제에 부딪쳤다. 애플리케이션없이 더 많은 조직과 내부 네임 스페이스를 제공하는 방법을 원했다.

  • 외부 종속성과 응용 프로그램 모듈을 혼합하거나 응용 프로그램 별 코드를 위해 전용 npm repos를 방해
  • 리팩토링 및 이해를 어렵게하는 상대적 요구 사항 사용
  • 심볼릭 링크를 사용하거나 노드 경로를 변경하여 소스 위치를 숨길 수 있고 소스 제어를 잘 수행하지 못함

결국 디렉토리가 아닌 파일 이름 지정 규칙을 사용하여 코드를 구성하기로 결정했습니다. 구조는 다음과 같습니다.

  • npm-shrinkwrap.json
  • package.json
  • node_modules
    • ...
  • src
    • app.js
    • app.config.js
    • app.models.bar.js
    • app.models.foo.js
    • app.web.js
    • app.web.routes.js
    • ...

그런 다음 코드에서 :

var app_config = require('./app.config');
var app_models_foo = require('./app.models.foo');

아니면 그냥

var config = require('./app.config');
var foo = require('./app.models.foo');

외부 의존성은 평소와 같이 node_modules에서 사용할 수 있습니다.

var express = require('express');

이러한 방식으로 모든 응용 프로그램 코드는 계층 적으로 모듈로 구성되며 응용 프로그램 루트와 관련된 다른 모든 코드에서 사용할 수 있습니다.

물론 가장 큰 단점은 파일 브라우저에서 실제로 트리로 구성된 것처럼 트리를 확장 / 축소 할 수 없다는 것입니다. 그러나 나는 모든 코드의 출처에 대해 매우 명시 적이며 '매직'을 사용하지 않는다는 것을 좋아합니다.


프로젝트 루트가 현재 작업 디렉토리라고 가정하면 다음과 같이 작동합니다.

// require built-in path module
path = require('path');

// require file relative to current working directory
config = require( path.resolve('.','config.js') );

당신이 사용하는 경우 원사를 대신 NPM 당신이 사용할 수있는 작업 공간을 .

services더 쉽게 원하는 폴더가 있다고 가정 해 보겠습니다 .

.
├── app.js
├── node_modules
├── test
├── services
│   ├── foo
│   └── bar
└── package.json

원사 작업 공간을 작성하려면 다음 package.json내에 파일을 작성 하십시오 services folder.

{
  "name": "myservices",
  "version": "1.0.0"
}

기본 package.json에서 다음을 추가하십시오.

"private": true,
"workspaces": ["myservices"]

yarn install프로젝트의 루트에서 실행하십시오 .

그런 다음 코드의 어느 곳에서나 할 수 있습니다.

const { myFunc } = require('myservices/foo')

다음과 같은 대신 :

const { myFunc } = require('../../../../../../services/foo')

나는 많은 솔루션을 시도했다. 나는 이것을 메인 파일 (예 : index.js)의 맨 위에 추가했다.

process.env.NODE_PATH = __dirname;
require('module').Module._initPaths();

스크립트가로드 될 때 프로젝트 루트가 NODE_PATH에 추가됩니다. 프로젝트 루트에서 상대 경로를 참조하여 프로젝트의 파일을 요구할 수 있습니다 var User = require('models/user'). 이 솔루션은 프로젝트에서 다른 것을 실행하기 전에 프로젝트 루트에서 기본 스크립트를 실행하는 한 작동합니다.


내가 만든 모듈 Undot을 사용할 수 있습니다 . 그것은 고급이 아니며 도우미 일뿐이므로 간단하게 그 지옥을 피할 수 있습니다.

예:

var undot = require('undot');
var User = undot('models/user');
var config = undot('config');
var test = undot('test/api/user/auth');

대답 중 일부는 패키지로 node_module에 코드를 추가하는 가장 좋은 방법이라고 말하고 동의합니다. 아마도 ../../../요구 를 잃을 수있는 가장 좋은 방법 이지만 실제로는 그렇게 할 수있는 방법이 없습니다.

버전 2.0.0에서 로컬 파일에서 패키지를 설치할 수 있습니다. 즉, 루트에 원하는 모든 패키지가있는 폴더를 만들 수 있습니다.

-modules
 --foo
 --bar 
-app.js
-package.json

따라서 package.json에서 다음 과 같이 외부 서버를 게시하거나 사용하지 않고 modules(또는 foobar)를 패키지로 추가 할 수 있습니다 .

{
  "name": "baz",
  "dependencies": {
    "bar": "file: ./modules/bar",
    "foo": "file: ./modules/foo"
  }
}

그 후 다른 패키지와 마찬가지로으로 npm install코드에 액세스 할 수 있습니다 var foo = require("foo").

자세한 정보는 여기에서 찾을 수 있습니다.

https://docs.npmjs.com/files/package.json#local-paths

다음은 패키지를 만드는 방법입니다.

https://docs.npmjs.com/getting-started/creating-node-modules


app.js에서 다음과 같이 정의 할 수 있습니다.

requireFromRoot = (function(root) {
    return function(resource) {
        return require(root+"/"+resource);
    }
})(__dirname);

어디에서든 루트에서 무언가를 원할 때마다 바닐라가 아닌 requireFromRoot를 사용하면됩니다. 지금까지 꽤 잘 작동합니다.


6 개월 이상 내가하고있는 실제 방법은 다음과 같습니다. node_modules라는 폴더를 프로젝트의 루트 폴더로 사용합니다.이 방법으로 절대 요구 사항이라고 부르는 모든 곳에서 항상 해당 폴더를 찾습니다.

  • node_modules
    • myProject
      • index.js require ( "./ someFolder / hey.js") 대신 require ( "myProject / someFolder / hey.js")를 요구할 수 있습니다.
      • hey.js를 포함하는 someFolder

이것은 폴더에 중첩되어있을 때 더 유용하며 절대적인 방식으로 설정된 경우 파일 위치를 변경하는 작업이 훨씬 적습니다. 나는 내 전체 응용 프로그램 에서 상대 요구 2 만 사용 합니다 .


이를 달성하는 가장 쉬운 방법은 앱 시작시 node_modules/app또는 (또는 호출하는 모든 것)을 가리키는 심볼릭 링크를 만드는 ../app입니다. 그런 다음에 전화하면 require("app/my/module")됩니다. 모든 주요 플랫폼에서 심볼릭 링크를 사용할 수 있습니다.

그러나 여전히 npm을 통해 설치되는 더 작고 유지 관리 가능한 모듈로 자료를 분할해야합니다. git-url을 통해 개인 모듈을 설치할 수도 있으므로 하나의 단일 앱 디렉토리를 가질 이유가 없습니다.


자신의 프로젝트에서 루트 디렉토리에 사용되는 .js 파일을 수정하고 해당 경로를 process.env변수 의 속성에 추가 할 수 있습니다. 예를 들면 다음과 같습니다.

// in index.js
process.env.root = __dirname;

그 후에는 어디서나 호텔에 액세스 할 수 있습니다.

// in app.js
express = require(process.env.root);

examples디렉토리 node_modules에 프로젝트의 루트에 대한 기호 링크가있는 기호를 포함 할 수 없으므로 project -> ../../예제를 사용할 수 require('project')있지만 매핑을 제거하지는 않지만 소스가 require('project')아닌 소스를 사용할 수 있습니다 require('../../').

나는 이것을 테스트했으며 v0.6.18에서 작동합니다.

project디렉토리 목록 :

$ ls -lR project
project:
drwxr-xr-x 3 user user 4096 2012-06-02 03:51 examples
-rw-r--r-- 1 user user   49 2012-06-02 03:51 index.js

project/examples:
drwxr-xr-x 2 user user 4096 2012-06-02 03:50 node_modules
-rw-r--r-- 1 user user   20 2012-06-02 03:51 test.js

project/examples/node_modules:
lrwxrwxrwx 1 user user 6 2012-06-02 03:50 project -> ../../

의 내용은 객체 index.js의 속성에 값을 할당하고 필요한 것을 나타내는 메시지와 함께 exports호출 console.log합니다. 의 내용은 test.js입니다 require('project').


또 다른 답변 :

이 폴더 구조를 상상해보십시오.

  • node_modules
    • 대쉬
  • src
    • 하위 디렉토리
      • foo.js
      • bar.js
    • main.js
  • 테스트

    • test.js

그런 다음 test.js 에서 다음 과 같은 파일이 필요합니다.

const foo = require("../src/subdir/foo");
const bar = require("../src/subdir/bar");
const main = require("../src/main");
const _ = require("lodash");

그리고 main.js에서 :

const foo = require("./subdir/foo");
const bar = require("./subdir/bar");
const _ = require("lodash");

이제 이것을 사용하여 babelbabel-plugin-module-resolver사용할 수 있습니다 . 2 개의 루트 폴더를 구성하는 babelrc 파일 :

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

이제 테스트src 에서 동일한 방식으로 파일을 요구할 수 있습니다 .

const foo = require("foo");
const bar = require("bar");
const main = require("main");
const _ = require("lodash");

es6 모듈 구문을 사용하려면 다음을 수행하십시오 .

{
    "plugins": [
        ["module-resolver", {
            "root": ["./src", "./src/subdir"]
        }],
        "transform-es2015-modules-commonjs"
    ]
}

그런 다음 테스트 에서 src 파일을 다음 같이 가져옵니다 .

import foo from "foo"
import bar from "bar"
import _ from "lodash"

누군가이 문제를 해결할 수있는 또 다른 방법을 찾고 있다면 노력에 대한 나의 기여는 다음과 같습니다.

https://www.npmjs.com/package/use-import

기본 아이디어 : 프로젝트의 루트에 파일 경로를 속기 이름으로 매핑하는 JSON 파일을 만들거나 use-automapper가져옵니다 . 그런 다음 해당 이름을 사용하여 파일 / 모듈을 요청할 수 있습니다. 이렇게 :

var use = require('use-import');
var MyClass = use('MyClass');

그게 있습니다.


내가하고 싶은 일은 node_module 디렉토리에서 노드를로드하는 방법을 활용하는 것입니다.

모듈 "thing"을로드하려고하면 다음과 같은 작업이 수행됩니다.

require('thing');

그런 다음 노드는 'node_module'디렉토리에서 'thing'디렉토리를 찾습니다.

node_module은 일반적으로 프로젝트의 루트에 있으므로이 일관성을 활용할 수 있습니다. (node_module이 루트에 있지 않으면 다른 자기 유발 두통이 있습니다.)

디렉토리로 들어간 다음 다시 나오면 노드 프로젝트의 루트에 대한 일관된 경로를 얻을 수 있습니다.

require('thing/../../');

그런 다음 / happy 디렉토리에 액세스하려면이 작업을 수행합니다.

require('thing/../../happy');

꽤 해킹이지만 node_modules로드 방법의 기능이 변경되면 처리해야 할 더 큰 문제가 있다고 생각합니다. 이 동작은 일관성을 유지해야합니다.

명확하게하기 위해 모듈 이름이 중요하지 않기 때문에이 작업을 수행합니다.

require('root/../../happy');

최근에 angular2에 사용했습니다. 루트에서 서비스를로드하고 싶습니다.

import {MyService} from 'root/../../app/services/http/my.service';

전역 변수를 도입하거나 노드 기본값을 재정의하지 않고 프로젝트 루트의 상대 경로로 패키지를 요구할 수있는이 작은 패키지를 작성했습니다.

https://github.com/Gaafar/pkg-require

이렇게 작동합니다

// create an instance that will find the nearest parent dir containing package.json from your __dirname
const pkgRequire = require('pkg-require')(__dirname);

// require a file relative to the your package.json directory 
const foo = pkgRequire('foo/foo')

// get the absolute path for a file
const absolutePathToFoo = pkgRequire.resolve('foo/foo')

// get the absolute path to your root directory
const packageRootPath = pkgRequire.root()

그냥은 우연히 이 글을 언급 응용 프로그램 모듈 경로를 . 다음과 같이 기본을 구성 할 수 있습니다.

require('app-module-path').addPath(baseDir);

"rekiure"라는 노드 모듈을 만들었습니다

상대 경로를 사용하지 않고도 요구할 수 있습니다.

https://npmjs.org/package/rekuire

사용하기 매우 쉽습니다


이 문제를 해결하기 위해 새로운 방법을 시도하고 있습니다.

spring 및 guice와 같은 다른 알려진 프로젝트의 예를 들어 모든 "require"문을 포함하는 "context"객체를 정의합니다.

이 객체는 사용하기 위해 다른 모든 모듈로 전달됩니다.

예를 들어

var context = {}

context.module1 = require("./module1")( { "context" : context } )
context.module2 = require("./module2")( { "context" : context } )

이를 위해서는 각 모듈을 opts를받는 함수로 작성해야합니다.

module.exports = function(context){ ... }

그런 다음 물건을 요구하는 대신 컨텍스트를 참조하십시오.

var module1Ref = context.moduel1;

원하는 경우 require 문을 수행하는 루프를 쉽게 작성할 수 있습니다.

var context = {};
var beans = {"module1" : "./module1","module2" : "./module2" }; 
for ( var i in beans ){
    if ( beans.hasOwnProperty(i)){
         context[i] = require(beans[i])(context);
    }
};

이렇게하면 모의 (테스트)하고 싶을 때 인생이 더 쉬워지고 코드를 패키지로 재사용 할 수있는 동시에 문제를 해결할 수 있습니다.

Bean 선언을 분리하여 컨텍스트 초기화 코드를 재사용 할 수도 있습니다. 예를 들어 main.js파일이 다음과 같이 보일 수 있습니다.

var beans = { ... }; // like before
var context = require("context")(beans); // this example assumes context is a node_module since it is reused.. 

이 방법은 외부 라이브러리에도 적용되며 필요할 때마다 이름을 하드 코딩 할 필요는 없지만 내보내기는 컨텍스트를 예상하는 함수가 아니므로 특별한 처리가 필요합니다.

나중에 빈을 함수로 정의 할 수도 있습니다 require. 환경에 따라 다른 모듈 을 만들 수 있지만이 스레드의 범위를 벗어납니다.


나는이 같은 문제에 문제가 있었기 때문에 include 라는 패키지를 작성했습니다 .

package.json 파일을 찾아서 프로젝트의 루트 폴더를 파악하는 핸들을 포함 시킨 다음 상대 경로 혼란없이 네이티브 require ()에 경로 인수를 전달하십시오. 나는 이것이 require () 대신에 패키지가 아닌 타사 파일이나 라이브러리를 처리 해야하는 도구라고 생각합니다. 같은 것

var async = require('async'),
    foo   = include('lib/path/to/foo')

이것이 유용 할 수 있기를 바랍니다.


앱의 진입 점 js 파일 (예 : 실제로 "노드"를 실행하는 파일)이 프로젝트 루트 디렉토리에있는 경우 rootpath npm module을 사용하여이 작업을 쉽게 수행 할 수 있습니다 . 통해 간단히 설치

npm install --save rootpath

... 시작점 js 파일의 맨 위에 다음을 추가하십시오.

require('rootpath')();

그 시점은 앞으로 모든 필요에서 전화는 이제 프로젝트 루트를 기준으로합니다 - 예를 들어이 require('../../../config/debugging/log');된다 require('config/debugging/log');(는 config 폴더는 프로젝트 루트입니다).


간단한 줄에서 u는 자신의 폴더를 모듈로 호출 할 수 있습니다.

이를 위해서는 다음이 필요합니다. global 및 app-module-path 모듈

여기서 "App-module-path"는 모듈이며 Node.js 모듈 검색 경로에 추가 디렉토리를 추가 할 수 있습니다. "global"은이 객체에 첨부 한 모든 항목이 앱의 모든 곳에서 사용 가능하다는 것입니다.

이제이 스 니펫을 살펴보십시오.

global.appBasePath = __dirname;

require('app-module-path').addPath(appBasePath);

__dirname은 현재 노드의 실행중인 디렉토리입니다. 여기에 모듈 경로를 검색하기위한 고유 한 경로를 제공 할 수 있습니다.


그냥 후속 할 좋은 대답 에서 파올로 모레티 와 Browserify. 당신이 transpiler를 사용하는 (예를 들어, 바벨, 타이프 라이터) 및 소스에 대한 별도의 폴더와 같은 transpiled 코드가있는 경우 src/dist/, 당신은 솔루션 등의 변형을 사용할 수 있습니다

node_modules

다음과 같은 디렉토리 구조

app
  node_modules
    ... // normal npm dependencies for app
  src
    node_modules
      app
        ... // source code
  dist
    node_modules
      app
        ... // transpiled code

그러면 babel 등이 src디렉토리를 dist디렉토리 로 변환하도록 할 수 있습니다 .

심볼릭 링크

symlink를 사용하면 몇 가지 중첩 수준을 제거 할 수 있습니다

app
  node_modules
    ... // normal npm dependencies for app
  src
    node_modules
      app // symlinks to '..'
    ... // source code
  dist
    node_modules
      app // symlinks to '..'
    ... // transpiled code

바벨을 가진주의 --copy는-파일--copy-files 의 플래그가 babel아니라 심볼릭 링크를 처리하지 않습니다. ..심볼릭 링크를 계속 탐색하고 끝없는 파일을 회상 적으로 볼 수 있습니다. 해결 방법은 다음 디렉토리 구조를 사용하는 것입니다.

app
  node_modules
    app // symlink to '../src'
    ... // normal npm dependencies for app
  src
    ... // source code
  dist
    node_modules
      app // symlinks to '..'
    ... // transpiled code

이런 식으로, 아래 코드 src는 여전히로 app해결 src되지만 babel은 더 이상 심볼릭 링크를 볼 수 없습니다.


얼마 전에 미리 정의 된 경로를 기준으로 모듈을로드하기위한 모듈을 만들었습니다.

https://github.com/raaymax/irequire

필요 대신 사용할 수 있습니다.

irequire.prefix('controllers',join.path(__dirname,'app/master'));
var adminUsersCtrl = irequire("controllers:admin/users");
var net = irequire('net');

아마 누군가에게 유용 할 것입니다 ..

참고 URL : https://stackoverflow.com/questions/10860244/how-to-make-node-js-require-absolute-instead-of-relative

반응형