Node.js package.json मुख्य पैरामीटर


147

मैंने पहले से ही कुछ खोज की है। हालाँकि, पैकेज में मुख्य पैरामीटर के बारे में अभी भी संदेह है। Node.js.

  1. इस क्षेत्र में भरने से कैसे मदद मिलेगी? दूसरे तरीके से पूछते हुए, क्या मैं इस क्षेत्र में मॉड्यूल को एक अलग शैली में शुरू कर सकता हूं यदि यह क्षेत्र प्रस्तुत करता है?
  2. क्या मुझे मुख्य पैरामीटर में भरी जाने वाली एक से अधिक स्क्रिप्ट मिल सकती हैं? यदि हाँ, तो क्या वे दो धागे के रूप में शुरू किए जाएंगे? यदि नहीं, तो मैं एक मॉड्यूल में दो स्क्रिप्ट कैसे शुरू कर सकता हूं और उन्हें समानांतर में चला सकता हूं?

मुझे पता है कि दूसरा सवाल काफी अजीब है। ऐसा इसलिए है क्योंकि मैंने OpenShift पर एक Node.js एप्लिकेशन होस्ट किया है, लेकिन एप्लिकेशन में दो मुख्य घटक होते हैं। एक REST एपीआई और एक सूचना देने वाली सेवा होने के नाते।

मुझे डर है कि सूचना देने की प्रक्रिया REST API को ब्लॉक कर देगी यदि उन्हें एक ही धागे के रूप में लागू किया गया। हालांकि, उन्हें उसी MongoDB कारतूस से कनेक्ट करना होगा। इसके अलावा, मैं एक गियर बचाना चाहूंगा यदि संभव हो तो दोनों घटक एक ही गियर में सेवा कर सकते हैं।

किसी भी सुझाव का स्वागत है।

जवाबों:


149

से NPM प्रलेखन :

मुख्य क्षेत्र एक मॉड्यूल आईडी है जो आपके कार्यक्रम का प्राथमिक प्रवेश बिंदु है। यही है, अगर आपके पैकेज का नाम फू है, और एक उपयोगकर्ता इसे स्थापित करता है, और फिर उसे ("फू") की आवश्यकता होती है, तो आपके मुख्य मॉड्यूल का निर्यात ऑब्जेक्ट वापस आ जाएगा।

यह आपके पैकेज फ़ोल्डर की जड़ के सापेक्ष एक मॉड्यूल आईडी होना चाहिए।

अधिकांश मॉड्यूल के लिए, यह मुख्य स्क्रिप्ट के लिए सबसे अधिक समझ में आता है और अक्सर अधिक नहीं।

इसे कम करने के लिए:

  1. यदि आपके पैकेज में प्रवेश बिंदु इसके रूट फ़ोल्डर से अलग है तो आपको केवल एक mainपैरामीटर की आवश्यकता है । उदाहरण के लिए, लोगों को अक्सर करने के लिए प्रवेश बिंदु डाल या , इस मामले इसी लिपि के रूप में वर्णित किया जाना चाहिए में में ।package.jsonindex.jslib/index.jslib/<packagename>.jsmainpackage.json
  2. आपके पास दो स्क्रिप्ट नहीं हो सकती हैं main, केवल इसलिए कि प्रवेश बिंदु require('yourpackagename')को स्पष्ट रूप से परिभाषित किया जाना चाहिए।

धन्यवाद, तब मैं घटक को एक बच्चे की प्रक्रिया के रूप में लागू करने पर विचार करूंगा।
गैविन

1
अतिरिक्त नोट 1, electronसम्मान मुख्य पैरामीटर, यानी electron .एक सबफ़ोल्डर से सही काम शुरू करता है, और भी है, तो एक जैसे एक "main": "dist/app/index.js",में package.json(साथ ही अन्य प्लेटफार्मों / चौखटे के लिए सच पकड़ सकता है)।
फ्रैंक नोके

1
साइड-नोट 2: You can't have two scripts as main...- सच। हालाँकि, यदि आपका पैकेज उदाहरण के लिए कई CLI कमांड (विकास के दौरान सुलभ ./node_modules/.bin/<symlink>) के लिए "बिन" पैरामीटर की जाँच करने के लिए होता है
फ्रैंक नॉक

मेरे पास / index.js है, लेकिन अगर मैं इसे src / index.js में बदलता हूं तो यह कुछ भी करता है। यह अभी भी buld / index की ओर इशारा करता है। मैं npm लिंक का उपयोग कर रहा हूं
कार्लोस

हर कोई .jsयहाँ एक्सटेंशन का उपयोग कर रहा है, लेकिन "मॉड्यूल पहचानकर्ता" के पास एक्सटेंशन नहीं हैं .. मैं उस अस्पष्टता को नापसंद करता हूं जिसके बारे में हम उपयोग करने वाले हैं
ChaseMoskal

47

आपके पहले प्रश्न का उत्तर देने के लिए, जिस तरह से आप एक मॉड्यूल को लोड करते हैं वह मॉड्यूल प्रविष्टि बिंदु और पैकेज के मुख्य पैरामीटर पर निर्भर करता है । json

मान लें कि आपके पास निम्न फ़ाइल संरचना है:

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

में मुख्य पैरामीटर के बिना package.json , आप मॉड्यूल प्रवेश बिंदु देकर मॉड्यूल लोड करने के लिए है: require('my-npm-module/lib/module.js')

यदि आप पैकेज.जॉन मुख्य पैरामीटर को निम्नानुसार सेट करते हैं "main": "lib/module.js", तो आप मॉड्यूल को इस तरह से लोड करने में सक्षम होंगे require('my-npm-module'):।


20

यदि आपके पास आपकी package.jsonफ़ाइल में उदाहरण के लिए है :

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

lib/entry.js आपके पैकेज का मुख्य प्रवेश बिंदु होगा।

जब बुला रहे हो

require('zig-zag');

नोड में, lib/entry.jsवास्तविक फ़ाइल होगी जो आवश्यक है।


1
इसलिए यदि कोड आयात करने के लिए नहीं है, तो क्या हम 'मुख्य' पैरामीटर को छोड़ सकते हैं?
कोकोडोको

@ कोकोडोको हाँ जो इस मामले में सुझाया गया है
cquezel

7

mainकुंजी का एक महत्वपूर्ण कार्य यह है कि यह आपके प्रवेश बिंदु के लिए मार्ग प्रदान करता है। साथ काम करते समय यह बहुत मददगार है nodemon। यदि आप के साथ काम करते हैं nodemonऔर आप mainकुंजी को अपने package.jsonकहे अनुसार परिभाषित करते हैं "main": "./src/server/app.js", तो आप nodemonसीएलआई में टाइप के साथ सर्वर को क्रैंक कर सकते हैं बजाय रूट के साथ pwd के रूप मेंnodemon ./src/server/app.js


3

जहाँ तक मुझे पता है, यह npm के लिए आपके नोड पैकेज (पुस्तकालय) का मुख्य प्रवेश बिंदु है। यह केवल तभी आवश्यक है जब आपका npm प्रोजेक्ट एक नोड पैकेज (लाइब्रेरी) बन जाए जिसे दूसरों द्वारा npm के माध्यम से स्थापित किया जा सकता है।


मान लीजिए कि आपके पास बिल्ड /, डिस्ट /, या लिब / फोल्डर वाली लाइब्रेरी है। इस फ़ोल्डर में, आपको अपनी लाइब्रेरी के लिए निम्न संकलित फ़ाइल मिली:

-lib/
--bundle.js

फिर अपने package.json में , आप npm को लाइब्रेरी (नोड पैकेज) तक पहुंचने का तरीका बताएं:

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

अपने JS प्रोजेक्ट में npm के साथ नोड पैकेज को स्थापित करने के बाद, आप अपनी बंडल किए गए बंडल से कार्यात्मकताओं को आयात कर सकते हैं। js फ़ाइल:

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

आपकी लाइब्रेरी के लिए कोड विभाजन (उदाहरण के लिए वेबपैक) का उपयोग करते समय यह भी सच है । उदाहरण के लिए, यह webpack.config.js एक के बजाय कई बंडलों में प्रोजेक्ट को विभाजित करने वाले कोड का उपयोग करता है।

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

फिर भी, आप अपने पैकेज में अपनी लाइब्रेरी में एक मुख्य प्रवेश बिंदु को परिभाषित करेंगे । json :

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

फिर लाइब्रेरी का उपयोग करते समय, आप अपनी फ़ाइलों को अपने मुख्य प्रवेश बिंदु से आयात कर सकते हैं:

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

हालांकि, आप पैकेज से मुख्य प्रविष्टि बिंदु को भी बायपास कर सकते हैं । आगजनी और कोड बंटे हुए बंडलों को आयात करें:

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

सब के बाद, आपके package.json में मुख्य संपत्ति केवल आपके पुस्तकालय के मुख्य प्रविष्टि बिंदु फ़ाइल को इंगित करती है।


0

OpenShift के लिए, आपको केवल (प्रति एप्लिकेशन) बाइंड करने के लिए एक PORT और IP जोड़ी मिलती है। ऐसा लगता है कि आपको प्रत्येक सेवा समापन बिंदु के लिए आंतरिक मार्गों को जोड़कर एक ही नोड्ज उदाहरण से दोनों सेवाओं की सेवा करने में सक्षम होना चाहिए।

मुझे इस बारे में कुछ जानकारी है कि ओपनशिफ्ट आपके प्रोजेक्ट के पैकेज का उपयोग कैसे करता है। अपने आवेदन को शुरू करने के लिए यहां जाएं : https://www.openshift.com/blogs/run-your-nodejs-projects-on-openshift-in-two-simple-steps #package_json


-5

बस इसे "शुरुआती बिंदु" के रूप में सोचें।

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के अर्थ में, C # कहें, यह ऑब्जेक्ट क्लास का init () या कंस्ट्रक्टर है, इसका मतलब "एंट्री पॉइंट" है।

उदाहरण के लिए

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

    ...   // many others such as function, properties, etc.
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.