Parameter utama Node.js package.json

147

Saya sudah melakukan beberapa pencarian. Namun, masih memiliki keraguan tentang parameter utama di package.json dari Node.js.

  1. Bagaimana mengisi bidang ini bisa membantu? Bertanya dengan cara lain, dapatkah saya memulai modul dengan gaya yang berbeda jika bidang ini disajikan?
  2. Bisakah saya memiliki lebih dari satu skrip yang diisi ke dalam parameter utama? Jika ya, apakah mereka akan dimulai sebagai dua utas? Jika tidak, bagaimana saya bisa memulai dua skrip dalam sebuah modul dan menjalankannya secara paralel?

Saya tahu bahwa pertanyaan kedua cukup aneh. Itu karena saya telah meng-host aplikasi Node.js di OpenShift tetapi aplikasi terdiri dari dua komponen utama. Satu menjadi REST API dan satu menjadi layanan pengiriman notifikasi.

Saya khawatir bahwa proses pengiriman notifikasi akan memblokir REST API jika diterapkan sebagai utas tunggal. Namun, mereka harus terhubung ke kartrid MongoDB yang sama. Selain itu, saya ingin menyimpan satu gigi jika kedua komponen bisa berfungsi dalam gigi yang sama jika memungkinkan.

Setiap saran dipersilahkan.

Gavin
sumber

Jawaban:

149

Dari dokumentasi npm :

Bidang utama adalah ID modul yang merupakan titik masuk utama ke program Anda. Yaitu, jika paket Anda bernama foo, dan seorang pengguna menginstalnya, dan kemudian membutuhkan ("foo"), maka objek ekspor modul utama Anda akan dikembalikan.

Ini harus berupa ID modul relatif terhadap root folder paket Anda.

Untuk sebagian besar modul, paling masuk akal untuk memiliki skrip utama dan seringkali tidak banyak yang lain.

Singkatnya:

  1. Anda hanya perlu mainparameter di Anda package.jsonjika titik masuk ke paket Anda berbeda dari index.jsdi folder root. Sebagai contoh, orang sering meletakkan titik masuk ke lib/index.jsatau lib/<packagename>.js, dalam hal ini skrip yang sesuai harus dijelaskan seperti mainpada package.json.
  2. Anda tidak dapat memiliki dua skrip sebagai main, hanya karena titik masuk require('yourpackagename')harus didefinisikan secara jelas.
bredikhin
sumber
Terima kasih, maka saya akan mempertimbangkan menerapkan komponen sebagai proses anak.
Gavin
1
Catatan sisi 1, electronmenghargai parameter utama, yaitu electron .memulai hal yang benar dari subfolder, jika ada misalnya "main": "dist/app/index.js",dalam package.json(mungkin berlaku untuk platform / kerangka kerja lain juga).
Frank Nocke
1
Catatan sisi 2: You can't have two scripts as main...- benar. Namun, jika paket Anda kebetulan menyediakan misalnya beberapa perintah CLI (selama pengembangan dapat diakses di bawah ./node_modules/.bin/<symlink>) periksa parameter "bin" .
Frank Nocke
Saya telah membangun / index.js tetapi jika saya mengubahnya ke src / index.js itu tidak melakukan apa-apa. masih menunjuk ke buld / index. Saya menggunakan tautan npm
Carlos
semua orang menggunakan .jsekstensi di sini, tetapi "pengidentifikasi modul" tidak memiliki ekstensi .. saya tidak suka ambiguitas tentang yang seharusnya kita gunakan
ChaseMoskal
47

Untuk menjawab pertanyaan pertama Anda, cara Anda memuat modul tergantung pada titik masuk modul dan parameter utama package.json .

Katakanlah Anda memiliki struktur file berikut:

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

Tanpa parameter utama dalam package.json , Anda harus memuat modul dengan memberikan entry point modul: require('my-npm-module/lib/module.js').

Jika Anda mengatur package.json parameter utama sebagai berikut "main": "lib/module.js", Anda akan dapat memuat modul cara ini: require('my-npm-module').

Bastien
sumber
20

Jika Anda memiliki misalnya dalam package.jsonfile Anda :

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

lib/entry.js akan menjadi titik masuk utama ke paket Anda.

Saat menelepon

require('zig-zag');

dalam node, lib/entry.jsakan menjadi file aktual yang diperlukan.

prosti
sumber
1
Jadi jika kode tidak dimaksudkan untuk diimpor, dapatkah kita mengabaikan parameter 'utama'?
Kokodoko
@Kokodoko ya itulah yang disarankan dalam kasus ini
cquezel
7

Salah satu fungsi penting dari mainkunci adalah menyediakan jalur untuk titik masuk Anda. Ini sangat membantu ketika bekerja dengan nodemon. Jika Anda bekerja dengan nodemondan Anda menentukan mainkunci di Anda package.jsonsebagai katakanlah "main": "./src/server/app.js", maka Anda dapat dengan mudah menghidupkan server dengan mengetikkan nodemonCLI dengan root sebagai pwd bukan nodemon ./src/server/app.js .

Akash
sumber
3

Sejauh yang saya tahu, itu adalah titik masuk utama ke paket node Anda (pustaka) untuk npm. Ini hanya diperlukan jika proyek npm Anda menjadi paket simpul (pustaka) yang dapat diinstal melalui npm oleh orang lain.


Katakanlah Anda memiliki perpustakaan dengan folder build /, dist /, atau lib /. Di folder ini, Anda mendapatkan file yang dikompilasi berikut untuk perpustakaan Anda:

-lib/
--bundle.js

Kemudian di package.json Anda, Anda memberi tahu npm cara mengakses perpustakaan (paket node):

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

Setelah menginstal paket node dengan npm ke proyek JS Anda, Anda dapat mengimpor fungsionalitas dari file bundle.js yang dibundel :

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

Ini berlaku juga ketika menggunakan Pemecahan Kode (misalnya Webpack) untuk pustaka Anda. Sebagai contoh, webpack.config.js ini menggunakan kode yang membagi proyek menjadi beberapa bundel alih-alih satu.

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',
  },
  ...
}

Namun, Anda akan mendefinisikan satu titik masuk utama ke perpustakaan Anda di package.json Anda :

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

Kemudian ketika menggunakan perpustakaan, Anda dapat mengimpor file Anda dari titik masuk utama Anda:

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

Namun, Anda juga dapat mem - bypass titik masuk utama dari package.json dan mengimpor bundel kode yang terpecah:

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

Setelah semua, properti utama di package.json Anda hanya menunjuk ke file titik entri utama perpustakaan Anda.

Robin Wieruch
sumber
0

Untuk OpenShift, Anda hanya mendapatkan satu PORT dan IP pair untuk diikat (per aplikasi). Kedengarannya seperti Anda harus dapat melayani kedua layanan dari instance nodejs tunggal dengan menambahkan rute internal untuk setiap titik akhir layanan.

Saya punya beberapa info tentang bagaimana OpenShift menggunakan package.json proyek Anda untuk memulai aplikasi Anda di sini: https://www.openshift.com/blogs/run-your-nodejs-projects-on-openshift-in-two-simple-steps #package_json

ʀɣαɳĵ
sumber
-5

Anggap saja sebagai "titik awal".

Dalam pengertian pemrograman berorientasi objek, katakanlah C #, itu adalah init () atau konstruktor dari kelas objek, itulah yang dimaksud "titik masuk".

Sebagai contoh

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

    ...   // many others such as function, properties, etc.
}
Jeb50
sumber