programing

Node.js 'require'를 절대로 만들려면 어떻게 해야 합니까?(상대값 제외)

batch 2023. 5. 21. 17:42
반응형

Node.js 'require'를 절대로 만들려면 어떻게 해야 합니까?(상대값 제외)

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

예를 들어 Express.js의 app.js line 6을 보면 다음과 같습니다.

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

그건 정말 나쁜 일이야, IMO.제 모든 예를 한 단계만 더 뿌리에 가깝게 하고 싶다고 상상해 보십시오.30개 이상의 예제를 업데이트해야 하고 각 예제 내에서 여러 번 업데이트해야 하기 때문에 불가능할 수 없습니다.대상:

express = require('../')

제 해결책은 루트 기반의 특수한 경우를 사용하는 것입니다. 문자열이 $로 시작하면 프로젝트의 루트 폴더에 상대적입니다.

어떻게 해야 합니까?

업데이트 2

이제 Require를 사용합니다.한 가지 방법으로 쓸 수 있고 클라이언트와 서버 모두에서 작동하는 JS.요구하다JS를 사용하면 사용자 지정 경로를 만들 수도 있습니다.

업데이트 3

이제 Webpack과 Gulp.js이동하여 서버 측 모듈을 처리하기 위해 enhanced-require를 사용합니다.근거는 여기를 참조하십시오. http://hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/

사용:

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

메인 JavaScript 파일에서 필요한 것처럼 파일이 필요하기 때문에 메인 JavaScript 파일이 프로젝트의 루트에 있는 한 잘 작동합니다.그리고 그것이 제가 감사하게 생각하는 것입니다.

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

피하다 / 피하다 / 피하다 / 피하다 / 피하다 / 피하다

애플리케이션의 모든 것이 공용 npm에 제대로 속하는 것은 아니며 개인 npm 또는 git repo 설정의 오버헤드는 여전히 많은 경우에 상당히 큽니다.다음은 다음과 같은 몇 가지 접근 방식입니다.../../../../../../../상대 경로 문제.

node_module

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

답은 매우 간단합니다!만약 당신이 가지고 있다면..gitignorenode_modules:

node_modules

다을사용예여추수있가다습니할외를음으로 예외를 .! 프로그램모듈에 : " " " " 은 다음과 같습니다.

node_modules/*
!node_modules/foo
!node_modules/bar

상위 디렉터리가 이미 무시된 경우 하위 디렉터리를 무시할 수 없습니다.그래서 무시하는 대신에node_modules당신은 내부의 모든 디렉토리를 무시해야 합니다. node_modulesnode_modules/*그런 다음 예외를 추가할 수 있습니다.

이제 애플리케이션의 어디에서나require('foo')또는require('bar')아주 크고 취약한 상대 경로를 갖지 않고 말입니다.

더로 유지하려면 을 에많은모있더분모상유다려됩두의 .node_modules를 들면node_modules/app:

node_modules/app/foo
node_modules/app/bar

이제 당신은 할 수 있을 것입니다.require('app/foo')또는require('app/bar')응용프로그램의 모든 위치에서.

의 신의에서..gitignore에대예외추니다가합를한▁▁add▁an다에 예외를 추가하면 .node_modules/app:

node_modules/*
!node_modules/app

응프로에패구로있경변우. 합니다json, 당자별있패키합만를니다들야어지신.은 당신의 고유 있습니다.node_modules/foo또는node_modules/app/foo모듈 경계에 걸쳐 변환이 적용되지 않기 때문에 구성 요소 디렉터리입니다.이렇게 하면 모듈이 응용프로그램의 구성 변경에 대해 보다 강력하게 작동하고 응용프로그램 외부에서 패키지를 독립적으로 재사용하는 것이 더 쉬워집니다.

심볼릭 링크

수 가 없는 또 은 심볼릭 링크를 입니다.lib/또는app/를 에접으로 접습니다.node_modules프로젝트 루트에서 다음 작업을 수행합니다.

ln -s ../lib node_modules/app

할 수 lib/를 으로써.require('app/foo.js')갖기 위해lib/foo.js.

사용자 지정 경로

당신은 몇몇 장소들이 사용에 대해 이야기하는 것을 볼 수 있습니다.$NODE_PATH 또는 환경변수opts.paths노드에 대한 디렉토리를 추가하고 모듈을 찾기 위해 검색하기 위해 브라우저를 검색합니다.

대부분의 다른 플랫폼과 달리 셸 스타일의 경로 디렉토리 배열을 사용합니다.$NODE_PATH▁use▁the▁effective▁of▁not를 효과적으로 사용하는 것에 비해 노드에서 호의적이지 않습니다.node_modules디렉토리입니다.

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

합니다.$NODE_PATH.

공유 코드를 위해 새 node_modules 폴더를 만들고 싶습니다.그런 다음 Node.js와 'require'가 최선을 다하도록 합니다.

예:

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

를 들어,이 들예어당에 있으면, 만약신이를이.car/index.js넌 할 수 있다.require('helper')Node.js가 찾을 것입니다!

node_modules 작동 방식

Node.js는 경쟁 플랫폼 간에 고유한 모듈을 해결하기 위한 영리한 알고리즘을 가지고 있습니다.

네가 만약require('./foo.js')/beep/boop/bar.js는 Node.js 파일을 ../foo.js/beep/boop/foo.js으로 ./또는../ 호하는파항로컬다니입을 호출하는 입니다.require().

당신이 그나다음같비은관이필경우요한름이와 이 아닌 을 'require('xyz')/beep/boop/foo.jsNode.js는 이러한 경로를 순서대로 검색하여 첫 번째 일치에서 중지하고 아무것도 발견되지 않으면 오류를 발생시킵니다.

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

각에 xyz Node는 먼저 js를 찾습니다.xyz/package.json가 있는지 확인하기 위해"main"필드가 존재합니다."main"필드는 다음과 같은 경우 어떤 파일을 처리해야 하는지 정의합니다.require()디렉터리 경로.

를 들어, 만약에 들어만, 약를./beep/node_modules/xyz는 첫 번째 이자 첫번시합이고째▁and▁the입니다./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저기. Voila!전체 프로젝트에서 해당 네임스페이스의 모든 항목에 액세스할 수 있습니다.패키지는 코드를 글로벌 네임스페이스로 가져오는 올바른 방법입니다.

기타 해결 방법

저는 개인적으로 이러한 기술을 사용하지 않지만, 그들은 여러분의 질문에 답합니다. 그리고 물론 여러분은 저보다 여러분 자신의 상황을 더 잘 알고 있습니다.

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

다음으로, 모든 예제에서 공통 로컬 파일을 사용하여 손상시킬 수 있습니다.이 공통 파일은 상위 디렉터리에 있는 실제 파일을 다시 내보냅니다.

예제/예시/앱.js(그리고 많은 다른 사람들이 좋아합니다)

var express = require('./express')

예문/예문/예문.js

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

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

만약 당신이 npm 대신 yarn을 사용한다면 작업 공간을 사용할 수 있습니다.

예를 들어 폴더가 있다고 가정합니다.services 더.

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

Yarn 작업영역을 작성하려면 다음을 작성합니다.package.json 내부에 합니다.services folder:

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

메인 패키지에 있습니다.json 추가:

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

려달을 합니다.yarn install프로젝트의 근본부터.

그런 다음 코드의 모든 위치에서 다음 작업을 수행할 수 있습니다.

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

다음과 같은 것 대신에:

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

node-rfr을 확인합니다.

이것은 다음과 같이 간단합니다.

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

사용합니다process.cwd()내 프로젝트에서.예:

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

이는 다음과 같은 결과를 초래할 것이라는 점에 주목할 필요가 있습니다.require절대적인 길을 걷고 있습니다. 아직 이 문제에 부딪힌 적은 없지만요.

은 자신의 을 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');


@Totty, I've comed up with another solution, which could work for case you described in comments. Description gonna be tl;dr, so I better show a picture with 나의 시험 프로젝트의 구조.

여기 이 문제에 대한 논의가 잘 되어 있습니다.

동일한 아키텍처 문제에 직면했습니다. 즉, 다음과 같은 문제 없이 애플리케이션에 더 많은 조직 및 내부 네임스페이스를 제공할 수 있는 방법이 필요했습니다.

  • 애플리케이션 모듈을 외부 종속성과 혼합하거나 애플리케이션별 코드에 대한 개인 NPM 저장소를 사용하는 것이 번거로움
  • 리팩터링과 이해를 더 어렵게 만드는 상대적 요구를 사용하는 것.
  • 심볼릭 링크를 사용하거나 노드 경로를 변경하면 소스 위치가 모호해지고 소스 제어를 제대로 사용할 수 없습니다.

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

  • npm-skwrap.json
  • 꾸러미제이손
  • node_module
    • ...
  • src
    • app.js
    • app.config.js
    • app.models.bar .js
    • 앱. 앱.foo.js
    • app.web.js
    • app.web.web.web.sys.제이에스
    • ...

코드상으로는:

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_dll에서 사용할 수 있습니다.

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

저는 이러한 해결책들을 많이 시도해 보았습니다.이것을 메인 파일(예: index.js)의 맨 위에 추가했습니다.

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

그러면 스크립트가 로드될 때 프로젝트 루트가 NODE_PATH에 추가됩니다.인 " 에는다같프루상트경트참대프조다있수모로습요니파구할일든에을트젝서여하로를음의과은로젝▁as▁from▁in▁the▁such▁by▁allows▁any▁referen▁path다▁file▁root있▁my니▁project습▁me▁relative▁project▁require▁tocing수에▁its▁the서"와 같은 파일을 참조하여 프로젝트에 있는 모든 파일을 요구할 수 있습니다.var User = require('models/user')이 솔루션은 프로젝트 루트에서 다른 스크립트를 실행하기 전에 프로젝트 루트에서 기본 스크립트를 실행하는 동안 작동해야 합니다.

일부 답변은 node_modules 폴더에 코드를 패키지로 추가하는 것이 가장 좋은 방법이라고 말합니다.저도 동의합니다. 그리고 그것이 아마도 패배하는 가장 좋은 방법일 것입니다.../../../필요하지만, 그들 중 아무도 실제로 그렇게 할 방법을 주지 않습니다.

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

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

그래서 패키지로.json 당신은 추가할 수 있습니다.modules(또는)foo그리고.bar다음과 같은 외부 서버를 게시하거나 사용하지 않고 패키지로 사용할 수 있습니다.

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

그 후에 당신은 합니다.npm install은 그고당신코접수있다니습근할로 코드에 할 수 .var foo = require("foo")당신이 다른 모든 패키지를 처리하는 것처럼.

자세한 내용은 package.json에서 확인할 수 있습니다.

패키지를 생성하는 방법은 다음과 같습니다.Node.js 모듈을 만드는 중

넌 내가 만든 모듈을 사용할 수 있어, 언닷.그것은 발전된 것이 아닙니다. 단지 조력자일 뿐입니다. 그래서 당신은 단순함으로 그러한 지옥 같은 것들을 피할 수 있습니다.

예:

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

또 다른 대답:

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

  • node_message - lodash

  • src - subdir - 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");

그리고 주로.js:

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

이제 babelbabel-plugin-module-resolver를 이 .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"

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

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

그런 다음 루트에서 무언가를 필요로 할 때는 어디에 있든 바닐라 요구 대신 requireFromRoot를 사용하면 됩니다.아직까지는 저한테 꽤 효과가 있어요.

은 앱 시 심볼릭 입니다.node_modules/app(혹은 당신이 뭐라고 부르든) 그것은 가리키는 것입니다.../app 그럼그전면됩니다시하화냥됩▁call니다로 전화하시면 됩니다.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);

수동 심볼릭 링크(및 Windows 연결)

할 수 없었습니까?examples에 디터리포가 .node_modulesproject -> ../../따라서 예제를 사용할 수 있도록 허용합니다.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').

자동 심볼릭 링크

심볼릭 링크를 수동으로 생성할 때의 문제는 매번npm ci당신은 심볼릭 링크를 잃습니다.심볼 링크 프로세스를 종속성으로 만들면 비올라, 문제 없습니다.

»basetag의 심볼릭 링크(또는 윈도우즈 정션입니다.$ 때마다npm install또는npm ci실행:

npm install --save basetag
node_modules/$ -> ..

그러면 코드를 특별히 수정하거나 시스템을 필요로 하지 않습니다. $필요한 루트가 됩니다.

var foo = require('$/lib/foo.js');

의 사용이 마음에 들지 않는 경우$그리고 더 선호할 것입니다.# 다른 (단, 또다제것른외(는제다) 제외)@의 문자로 할 수 . npm). 포크를 사용하여 변경할 수 있습니다.

참고: Windows 심볼릭 링크(파일)에는 관리자 권한이 필요하지만 Windows 접합(디렉토리)에는 Windows 관리자 권한이 필요하지 않습니다.이것은 안전하고 신뢰할 수 있는 교차 플랫폼 솔루션입니다.

이것이 제가 6개월 이상 동안 하고 있는 실제 방식입니다.프로젝트에서 node_modules라는 이름의 폴더를 루트 폴더로 사용합니다. 이러한 방식으로 이 폴더는 항상 내가 절대 요구라고 부르는 모든 곳에서 검색됩니다.

  • node_module
    • 나의 프로젝트
      • required(./someFolder/hey.js") 대신 index.js("myProject/someFolder/hey.js")를 요청할 수 있습니다.
      • hey.js가 포함된 일부 폴더

이 기능은 폴더에 중첩되어 있을 때 더 유용하며 절대적으로 설정된 경우 파일 위치를 변경하는 작업이 훨씬 적습니다.나는 전체 앱에서 상대적으로 필요한 것을 2개만 사용합니다.

나는 방금 앱-모듈-경로를 언급하는 이 기사를 우연히 발견했습니다.다음과 같은 기본값을 구성할 수 있습니다.

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

모든 레벨의 파일을 필요로 하는 것과 동일한 단순성을 찾다가 모듈 별칭을 발견했습니다.

그냥 설치:

npm i --save module-alias

패키지를 엽니다.json 파일, 여기서 경로에 대한 별칭을 추가할 수 있습니다. 예를 들어,

"_moduleAliases": {
 "@root"      : ".", // Application's root
 "@deep"      : "src/some/very/deep/directory/or/file",
 "@my_module" : "lib/some-file.js",
 "something"  : "src/foo", // Or without @. Actually, it could be any string
}

간단히 별칭을 사용할 수 있습니다.

require('module-alias/register')
const deep = require('@deep')
const module = require('something')

이 문제를 해결할 수 있는 다른 방법을 찾고 있는 사람이 있다면, 다음은 이 노력에 대한 저의 기여입니다.

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

기본적인 아이디어는 파일 경로를 속기 이름에 매핑하는 JSON 파일을 프로젝트 루트에 생성하는 입니다.그런 다음 해당 이름을 사용하여 파일/모듈을 요청할 수 있습니다.이와 같은 경우:

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

그래서 있다.

글로벌 변수를 도입하거나 노드 기본값을 무시하지 않고 프로젝트 루트의 상대 경로에 따라 패키지를 요구할 수 있는 이 작은 패키지를 작성했습니다.

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()

저는 같은 문제를 여러 번 겪었습니다.이것은 npm 패키지를 사용하여 해결할 수 있습니다.내부에 심볼릭 링크를 생성할 때만 설치할 필요가 없습니다.node_modules당신의 베이스 경로로.

const localFile = require('$/local/file')
// instead of
const localFile = require('../../local/file')

$/...접두사는 항상 앱 루트 디렉터리와 관련된 파일을 참조합니다.

출처: 작성 방법basetag이 문제를 해결하기 위해

이를 위해 Node.js가 node_modules 디렉토리에서 로드되는 방법을 활용합니다.

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

require('thing');

그런 다음 Node.js는 'node_modules' 디렉토리에서 'thing' 디렉토리를 찾습니다.

node_modules 폴더가 일반적으로 프로젝트의 루트에 있기 때문에 이러한 일관성을 활용할 수 있습니다. (node_modules가 루트에 없으면 다른 자체적인 문제를 해결해야 합니다.)

디렉터리로 들어갔다가 다시 나온다면 Node.js 프로젝트의 루트에 대한 일관된 경로를 얻을 수 있습니다.

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

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

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

꽤 까다롭지만, node_modules 로드 방식의 기능이 바뀌면 더 큰 문제가 발생할 것 같습니다.이 동작은 일관성을 유지해야 합니다.

명확하게 하기 위해, 저는 모듈의 이름이 중요하지 않기 때문에 이렇게 합니다.

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

최근에 Angular 2에 사용했습니다.루트에서 서비스를 로드합니다.

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

저는 파올로 모레티브라우져파이의 훌륭한 답변에 대해 후속 조치를 하고 싶습니다.변환 파일러(예: babel, typescript)를 사용하고 있으며 소스 및 다음과 같은 변환된 코드에 대한 별도의 폴더가 있는 경우src/그리고.dist/을 신은솔루변당사수있용다습니할형을의션당▁a▁as로 사용할 수 .

node_module

다음 디렉터리 구조를 사용합니다.

app
  node_modules
    ... // Normal npm dependencies for app
  src
    node_modules
      app
        ... // Source code
  dist
    node_modules
      app
        ... // Transpiled code

그런 다음 Babel 등이 다음과 같이 변환하도록 할 수 있습니다.src dist디렉토리입니다.

심볼릭 링크

심볼릭 링크를 사용하여 다음과 같은 중첩 수준을 제거할 수 있습니다.

app
  node_modules
    ... // Normal npm dependencies for app
  src
    node_modules
      app // Symbolic links to '..'
    ... // Source code
  dist
    node_modules
      app // Symbolic links to '..'
    ... // Transpiled code

babel --copy-files에 대한 경고:--copy-filesbabel기호 링크를 잘 처리하지 않습니다.계속해서 안으로 이동할 수 있습니다...심볼릭 링크 및 무한 파일을 재귀적으로 볼 수 있습니다.해결 방법은 다음 디렉터리 구조를 사용하는 것입니다.

app
  node_modules
    app // Symbolic link to '../src'
    ... // Normal npm dependencies for app
  src
    ... // Source code
  dist
    node_modules
      app // Symbolic links to '..'
    ... // Transpiled code

이런 식으로 코드는 다음과 같습니다.src여전히 가지고 있을 것입니다.app으로 되었습니다.src반면에 바벨은 더 이상 심볼릭 링크를 보지 않을 것입니다.

가져오기 속성 사용

Node2023제거하는 JS를 사용하는 입니다.importspackage.json자세한 내용은 다음 게시물을 참조하십시오.

아래 코드에서 #root은 프로젝트 루트입니다.

(도움이 된다면답변과 이 게시물을 올려주시기 바랍니다.감사합니다!)

CommonJS 스타일 JavaScript의 경우:

// package.json
{
  "imports": {
    "#root/*.js": "./*.js"
  }
}

// main.js:
const Source = require('#root/path/to/Source.js');

// Source.js:
module.exports = class Source {
  // ...
}

ECMA스크립트 스타일 JavaScript의 경우:

// package.json:
{
  "type" : "module",
  "imports": {
    "#root/*.js": "./*.js"
  }
}

// main.js
import { Source } from '#root/path/to/Source.js';

// Source.js:
export class Source {
  // ...
}

장점:

  • 추가 패키지를 "가져오거나" 필요하지 않음(Babel.js 없음, 웹 팩 없음, 필요 없음)JS). NodeJS를 설치한 후 이 방법은 즉시 사용할 수 있습니다.

  • IDE 연결은 예상대로 작동합니다(Ctrl 키를 누른 상태에서 클래스 이름을 클릭하면 소스 파일로 바로 이동합니다).또한 끌어서 놓기 방식으로 원본 파일을 이동하면 파일 경로 참조가 자동으로 업데이트됩니다.에서 WebStorm 2022.3.2그리고.VS Code 1.76.2.)

  • 가용능과 함께 합니다..mjs 시스템)및 (ECMAScript 파일) ».cjs(CommonJS) 파일 형식입니다..cjs 및 .mjs에 있는 이 참조 게시물을 참조하십시오.

  • 된 예된항목수필없으로 .node_modules

  • OS 수준에서 Linux 파일 링크를 설정할 필요 없음

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

npm install --save rootpath

...그런 다음 진입점 js 파일의 맨 위에 다음을 추가합니다.

require('rootpath')();

프로젝트 예를 들어, "" " " " " " " " 입니다.require('../../../config/debugging/log'); 되다require('config/debugging/log');(구성 폴더가 프로젝트 루트에 있는 경우).

ES5 구문을 사용하는 경우 앱을 사용할 수 있습니다.ES6의 경우 다음과 같은 구성 파일을 사용하여 babel-plugin-module-resolver를 사용할 수 있습니다.

.babelrc

{
  "plugins": [
    ["module-resolver", {
      "root": ["./"],
      "alias": {
        "app": "./app",
        "config": "./app/config",
        "schema": "./app/db/schemas",
        "model": "./app/db/models",
        "controller": "./app/http/controllers",
        "middleware": "./app/http/middleware",
        "route": "./app/http/routes",
        "locale": "./app/locales",
        "log": "./app/logs",
        "library": "./app/utilities/libraries",
        "helper": "./app/utilities/helpers",
        "view": "./app/views"
      }
    }]
  ]
}

저는 rekuire라는 노드 모듈을 만들었습니다.

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

그것은 매우 사용하기 쉽습니다.

언급URL : https://stackoverflow.com/questions/10860244/how-can-i-make-node-js-require-absolute-instead-of-relative

반응형