Package.json'da 'main' parametresi nasıl kullanılır?


158

Zaten biraz araştırma yaptım. Bununla birlikte, bir Node projesinin package.json'daki 'main' parametresi hakkında hala şüpheleriniz var.

  1. Bu alanı doldurmak nasıl yardımcı olur? Başka bir şekilde sorarsak, bu alan mevcutsa modüle farklı bir tarzda başlayabilir miyim?
  2. Ana parametreye birden fazla komut dosyası doldurulabilir mi? Varsa, iki konu olarak mı başlatılıyorlar? Hayır ise, bir modülde iki komut dosyasını nasıl başlatabilirim ve bunların paralel olarak çalışmasını sağlayabilirim?

İkinci sorunun oldukça tuhaf olduğunu biliyorum. Bunun nedeni, OpenShift üzerinde bir Node.js uygulamasını barındırmam, ancak uygulamanın iki ana bileşenden oluşmasıdır. Biri REST API, diğeri de bildirim teslim hizmeti.

Korkarım ki bildirim teslim etme süreci, tek bir iş parçacığı olarak uygulanmışlarsa REST API'yi engelleyecektir. Ancak, aynı MongoDB kartuşuna bağlanmaları gerekir. Dahası, eğer mümkünse her iki bileşen de aynı viteste hizmet veriyorsa, bir vites kaydetmek isterim.

Herhangi bir öneri açığız.

Yanıtlar:


158

Gönderen npm belgelerinde :

Ana alan, programınızın birincil giriş noktası olan bir modül kimliğidir. Diğer bir deyişle, paketinizin adı foo ise ve bir kullanıcı onu yükler ve ardından ("foo") gerektirirse, ana modülünüzün dışa aktarım nesnesi döndürülür.

Bu, paket klasörünüzün köküne göre bir modül kimliği olmalıdır.

Çoğu modül için, bir ana betiğe sahip olmak en mantıklıdır ve çoğu zaman başka bir şey değildir.

Kısaca söylemek gerekirse:

  1. Paketinizin giriş noktası kök klasöründen farklıysa, yalnızca bir mainparametreye ihtiyacınız vardır . Örneğin, insanlar genellikle giriş noktasını koyarlar veya bu durumda karşılık gelen komut dosyası ' daki gibi tanımlanmalıdır .package.jsonindex.jslib/index.jslib/<packagename>.jsmainpackage.json
  2. mainGiriş noktasının require('yourpackagename')açık bir şekilde tanımlanması gerektiğinden iki komut dosyasına sahip olamazsınız .

Teşekkürler, o zaman bileşeni bir çocuk süreç olarak uygulamayı düşünürdüm.
Gavin

1
Yan not 1, electronana parametreleri kabul eder, yani electron .doğru şeyi bir alt klasörden başlatır, örneğin bir "main": "dist/app/index.js",giriş varsa package.json(diğer platformlar / çerçeveler için de geçerli olabilir).
Frank Nocke

1
Yan not 2: You can't have two scripts as main...- doğru. Bununla birlikte, paketiniz örneğin birden çok CLI komutu sağlıyorsa (geliştirme sırasında altından erişilebilir ./node_modules/.bin/<symlink>) "bin" parametresini kontrol edin .
Frank Nocke

Build / index.js'ye sahibim ancak src / index.js olarak değiştirirsem her şeyi yapar. hala buld / indeksi gösteriyor. Npm bağlantısını kullanıyorum
Carlos

.jsburada herkes uzantı kullanıyor , ancak "modül tanımlayıcılarının" uzantıları yok .. kullanmamız gereken belirsizlikten hoşlanmıyorum
ChaseMoskal

51

İlk sorunuzu yanıtlamak için, bir modülü yükleme şekliniz, modül giriş noktasına ve package.json'un ana parametresine bağlıdır .

Aşağıdaki dosya yapısına sahip olduğunuzu varsayalım:

my-npm-module
|-- lib
|   |-- module.js
|-- package.json

Ana parametre olmadan package.json , modül giriş noktası vererek modülü yüklemek zorunda: require('my-npm-module/lib/module.js').

Eğer ayarlarsanız package.json aşağıdaki gibi ana parametre "main": "lib/module.js", sen modülünü bu şekilde yüklemek mümkün olacak: require('my-npm-module').


23

Örneğin package.jsondosyanızda varsa:

{
"name": "zig-zag",
"main": "lib/entry.js",
...
}

lib/entry.js paketinizin ana giriş noktası olacaktır.

Ararken

require('zig-zag');

düğümde, lib/entry.jsgerekli olan gerçek dosya olacaktır.


1
Öyleyse, kodun içe aktarılması amaçlanmadıysa, 'ana' parametreyi dışarıda bırakabilir miyiz?
Kokodoko

@Kokodoko evet bu durumda önerilen şey bu
cquezel

7

mainAnahtarın önemli bir işlevi, giriş noktanızın yolunu sağlamasıdır. Bu, birlikte çalışırken çok faydalıdır nodemon. Eğer üzerinde çalışıyorsanız nodemonve diyelim ki mainanahtarınızı tanımlıyorsanız , o zaman CLI'yi root yerine pwd olarak yazarak sunucuyu basitçe yükseltebilirsiniz .package.json"main": "./src/server/app.js"nodemon nodemon ./src/server/app.js


4

Bildiğim kadarıyla, npm için düğüm paketinizin (kitaplık) ana giriş noktasıdır. Yalnızca npm projeniz, başkaları tarafından npm aracılığıyla kurulabilen bir düğüm paketi (kitaplık) haline gelirse gereklidir.


Build /, dist / veya lib / klasörüne sahip bir kitaplığınız olduğunu varsayalım. Bu klasörde, kitaplığınız için aşağıdaki derlenmiş dosya var:

-lib/
--bundle.js

Ardından package.json dosyanızda npm'ye kitaplığa (düğüm paketi) nasıl erişileceğini söylersiniz:

{
  "name": "my-library-name",
  "main": "lib/bundle.js",
  ...
}

JS projenize npm ile düğüm paketini kurduktan sonra, paketlenmiş bundle.js dosyanızdan işlevleri içe aktarabilirsiniz :

import { add, subtract } from 'my-library-name';

Bu, kitaplığınız için Kod Bölme (örneğin Web Paketi) kullanırken de geçerlidir . Örneğin, bu webpack.config.js , projeyi bir yerine birden çok pakete bölen koddan yararlanır.

module.exports = {
  entry: {
    main: './src/index.js',
    add: './src/add.js',
    subtract: './src/subtract.js',
  },
  output: {
    path: `${__dirname}/lib`,
    filename: '[name].js',
    library: 'my-library-name',
    libraryTarget: 'umd',
  },
  ...
}

Yine de, package.json dosyanızda kitaplığınıza bir ana giriş noktası tanımlarsınız :

{
  "name": "my-library-name",
  "main": "lib/main.js",
  ...
}

Ardından kitaplığı kullanırken, dosyalarınızı ana giriş noktanızdan içe aktarabilirsiniz:

import { add, subtract } from 'my-library-name';

Ancak, package.json'daki ana giriş noktasını atlayabilir ve bölünmüş kod paketlerini içe aktarabilirsiniz:

import add from 'my-library-name/lib/add';
import subtract from 'my-library-name/lib/subtract';

Sonuçta, package.json dosyanızdaki ana özellik, yalnızca kitaplığınızın ana giriş noktası dosyasına işaret eder.



-8

Sadece "başlangıç ​​noktası" olarak düşünün.

Nesne yönelimli programlama anlamında, örneğin C #, nesne sınıfının init () veya yapıcısıdır, "giriş noktası" budur.

Örneğin

public class IamMain  // when export and require this guy
{
    public IamMain()  // this is "main"
    {...}

    ...   // many others such as function, properties, etc.
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.