Как добавить каталог исходников в область require () в npm? - PullRequest
0 голосов
/ 26 октября 2019

У меня есть такая структура каталогов:

package.json
/src
  a.js
/test
  test_a.js

Это содержимое package.json:

{
  "name": "foo",
  "scripts": {
    "test": "mocha"
  },
  "devDependencies": {
    "mocha": "6.1.4"
  }
}

Это то, что я делаю в test_a.js:

var a = require('a');

И я получаю:

Error: Cannot find module 'a'

Однако, когда я изменяю это на все, все прекрасно работает:

var a = require('../src/a');

Вопросы: как сделатьЯ настраиваю package.json так, чтобы он знал, где находятся мои модули, и мне не нужно было бы указывать их по «абсолютному» пути ../src/?

1 Ответ

1 голос
/ 26 октября 2019

Нельзя разрешить динамические модули с помощью require("a"), поскольку в папке вашего проекта может быть файл с именем a.js, а в node_modules/a может быть пакет npm, что может привести к большему количеству ошибок.

Но есть варианты, которые вы можете сделать, чтобы избежать использования require("../src/").

Один из таких вариантов объяснен ниже (с использованием babel)

Структура папки

src/
  level1/
    b.js
  a.js
test/
  a.test.js

Шаг 1

Установка Babel и aнесколько других зависимостей

npm install --save-dev @babel/core @babel/cli @babel/preset-env babel-plugin-module-resolver

Шаг 2

Создание и настройка .babelrc файла в корневом каталоге проекта.

{
    "presets": [
        "@babel/env"
    ],
    "plugins": [
        [
            "module-resolver",
            {
                "root": [
                    "./src"
                ],
                "alias": {
                    "level1": "./src/level1"
                }
            }
        ]
    ]
}

Здесь, в module-resolver раздел Я добавил 2 псевдонима для путей к папкам.

"root": ["./src"] разрешает доступ к любому файлу в папке src, используя require("/path_to_file"). Пример: - require("/a"), require("/level1/b")

"alias": {"level1": "./src/level1"} разрешает доступ к любому файлу в папке src/level1, используя require("level1/path_to_file"). Пример: - require("level1/b")

Шаг 3

Запустите тесты, используя mocha --require @babel/register.

Окончательный вариант package.json будет выглядеть следующим образом.

{
  "name": "foo",
  "scripts": {
    "test": "mocha --require @babel/register",
  },
  "devDependencies": {
    "@babel/cli": "^7.6.4",
    "@babel/core": "^7.6.4",
    "@babel/preset-env": "^7.6.3",
    "@babel/register": "^7.6.2",
    "babel-plugin-module-resolver": "^3.2.0",
    "mocha": "6.1.4"
  }
}

a.test.js

var a = require("/a");
var level1 = require("level1/b");

var assert = require("assert");
describe("a.js", function() {
    it("should return `Hello from A`", function() {
      assert.equal(a(), "Hello from A");
    });
});

describe("b.js", function() {
  it("should return `Hello from B`", function() {
    assert.equal(level1(), "Hello from B");
  });
});

Соответствующие документы

https://babeljs.io/docs/en/

https://github.com/tleunen/babel-plugin-module-resolver

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...