wake-up-neo.net

Stammverzeichnis in package.json

Meine Frage betrifft eine bestehende Bibliothek, die ich als NPM-Modul veröffentlichen möchte. Die Bibliothek wird bereits verwendet und derzeit required über das lokale Dateisystem.

Wie kann ich das Stammverzeichnis der Dateien meines Moduls angeben?

Wenn ich eine Struktur habe wie:

.
├── package.json
├── src
|   ├── js
|   └────── lib
|   └───────── my
|   └───────────── thing.js
|   └───────────── that.js

Wie kann ich angeben, dass der Stamm meines Moduls und die zugänglichen Dateien src/js/lib/my/ sind?

Ich möchte von einem externen Projekt wie folgt verwenden:

var thing = require('my/thing'),
    that = require('my/that');

Ich habe die "files"-Eigenschaft in package.json gesehen. Ist dies der richtige Weg?

40
Drahcir

Eine native Lösung finden Sie in diesem Knoten issue https://github.com/nodejs/node/issues/14970

Die Funktionsanforderung schlägt ein mainDir-Feld in der package.json neben main vor.

Je mehr Menschen wählen, desto schneller/wahrscheinlicher wird es umgesetzt

7

Wie der doc sagt:

Das Hauptfeld ist eine Modul-ID, die der primäre Einstiegspunkt in Ihr Programm ist.

Sie haben also etwas wie "main": "src/js/lib/my/app.js" in Ihrer package.json-Datei.

Ich würde vorschlagen, dass Sie eine app.js-Datei und module.exports Ihre verschiedenen Kinder erstellen. Zum Beispiel:

 module.exports.thing = require('./thing');
 module.exports.that = require('./that');

Und benutze sie so:

var mylib = require('mylib')
  , thing = mylib.thing
  , that = mylib.that;
6
Yann Bertrand

package.json ist hauptsächlich eine Datei, die von npm zum Installieren und Verwalten von Abhängigkeiten verwendet wird.

das require-Konstrukt kümmert sich nicht viel um package.json, so dass Sie es nicht verwenden können, um die Funktionsweise von require zu unterlaufen und zu glauben, dass Pakete nicht dort sind, wo sie vom require-Ladeschema erwartet werden.

Die Dokumentation zu https://nodejs.org/api/modules.html und das Ladeschema finden Sie hier: https://nodejs.org/api/modules.html#modules_all_together

sie können möglicherweise die Technik verwenden, die in der Dokumentation als "Laden aus globalen Ordnern" bezeichnet wird, und die Umgebungsvariable NODE_PATH definieren.

ich empfehle Ihnen jedoch, sich an eine Standardmethode zu halten: - Legen Sie Ihre Module in ein Verzeichnis "node_modules" - oder starten Sie Ihre Modulhierarchie in demselben Verzeichnis, in dem sich Ihre app.js oder index.js befindet

2
Jerome WAGNER

Dies ist eine hässliche Problemumgehung, die die Wurzel Ihres Pakets verschmutzt. Aber bis Jordans Antwort funktioniert, fühlt sich dies wie der Weg an, um das zu erreichen, was Sie verlangen. 

Fügen Sie einfach eine Datei im Stammverzeichnis Ihres Pakets für jedes der Module hinzu, die Sie exportieren möchten, indem Sie die requir mit der Slash - Notation verwenden. Diese Datei hat den gleichen Namen wie das zu exportierende Modul und es wird einfach erneut exportiert. 

.
├── package.json
├── thing.js       <--
├── that.js        <--
├── src
|   ├── js
|   └────── lib
|   └───────── my
|   └───────────── thing.js
|   └───────────── that.js

Die Datei ./thing.js enthält zum Beispiel: 

module.exports = require('./src/js/lib/my/thing');

Und so könnte man es verlangen als:

const thing = require('mypackage/thing');

Wie in Fehler beim Hinzufügen der mainDir-Eigenschaft in package.json angegeben, können Sie Ihre Quellen und die package.json-Datei nur vorübergehend in ein Verzeichnis kopieren und von dort veröffentlichen.

1
kub1x

Eine andere Möglichkeit besteht darin, ECMAScript-Module (ES-Module) zu verwenden, insbesondere das Feld Paketexporte in Ihrer Datei package.json .

Bei einer package.json Datei mit dieser Konfiguration:

{
  "name": "my",
  "exports": {
    "./": "./src/js/lib/my/"
  }
}

Sie sollten Module aus der Bibliothek wie folgt importieren können:

import thing from 'my/thing'
import that from 'my/that'

Beachten Sie, dass sich die ES-Modulspezifikation im Stadium Stabilität: 1 - Experimentell befindet und Änderungen vorbehalten sind. Diese Lösung gilt für neuere Versionen von Browsern und node.js, die ES-Module unterstützen. Ich habe keine Ahnung, inwieweit dies mit CommonJS-Modulen kompatibel sein könnte.

0
Morgan

Im Webpack können Sie resolve.alias folgendermaßen angeben:

{
  resolve: {
    alias: {
      'my': 'my/src'
    }
  }
}

oder Sie können die Option directions in package.json angeben

{
  directions: {
    'lib': 'src/lib'
  }
}
0
刘联东