พารามิเตอร์หลักของ Node.js package.json


147

ฉันได้ทำการค้นหาค่อนข้างเรียบร้อยแล้ว อย่างไรก็ตามยังคงมีข้อสงสัยเกี่ยวกับพารามิเตอร์หลักใน package.json ของ Node.js

  1. การเติมลงในฟิลด์นี้จะช่วยได้อย่างไร ถามอีกวิธีหนึ่งฉันสามารถเริ่มโมดูลในสไตล์ที่แตกต่างได้ไหมถ้าฟิลด์นี้นำเสนอ?
  2. ฉันสามารถเติมสคริปต์มากกว่าหนึ่งตัวในพารามิเตอร์หลักได้หรือไม่ ถ้าใช่พวกเขาจะเริ่มเป็นสองหัวข้อหรือไม่? ถ้าไม่ฉันจะเริ่มสองสคริปต์ในโมดูลและให้พวกเขาทำงานในแบบคู่ขนานได้อย่างไร

ฉันรู้ว่าคำถามที่สองค่อนข้างแปลก เป็นเพราะฉันได้โฮสต์แอปพลิเคชั่น Node.js บน OpenShift แต่แอปพลิเคชันประกอบด้วยสององค์ประกอบหลัก หนึ่งเป็น REST API และอีกหนึ่งเป็นบริการส่งการแจ้งเตือน

ฉันกลัวว่ากระบวนการส่งการแจ้งเตือนจะบล็อก REST API หากมีการใช้งานเป็นเธรดเดียว อย่างไรก็ตามพวกเขาต้องเชื่อมต่อกับคาร์ทริดจ์ MongoDB เดียวกัน ยิ่งกว่านั้นฉันต้องการประหยัดหนึ่งเกียร์หากทั้งสององค์ประกอบสามารถให้บริการในเกียร์เดียวกันได้ถ้าเป็นไปได้

ข้อเสนอแนะใด ๆ ยินดีต้อนรับ

คำตอบ:


149

จากเอกสาร npm :

ฟิลด์หลักคือ ID โมดูลที่เป็นจุดเริ่มต้นหลักของโปรแกรมของคุณ นั่นคือถ้าแพ็คเกจของคุณชื่อ foo และผู้ใช้ติดตั้งแล้วต้องการ ("foo") จากนั้นวัตถุส่งออกโมดูลหลักของคุณจะถูกส่งกลับ

นี่ควรเป็น ID โมดูลที่สัมพันธ์กับรูทของโฟลเดอร์แพ็คเกจของคุณ

สำหรับโมดูลส่วนใหญ่มันสมเหตุสมผลที่สุดที่จะมีสคริปต์หลักและมักจะไม่มาก

วิธีทำให้สั้น:

  1. คุณต้องการmainพารามิเตอร์เฉพาะในpackage.jsonกรณีที่จุดเริ่มต้นไปยังแพ็คเกจของคุณแตกต่างจากindex.jsในโฟลเดอร์รูท ตัวอย่างเช่นคนที่มักจะวางจุดเริ่มต้นที่จะlib/index.jsหรือlib/<packagename>.jsในกรณีนี้สคริปต์จะต้องอธิบายว่าในmainpackage.json
  2. คุณไม่สามารถมีสองสคริปต์เนื่องจากmainเพียงจุดเข้าใช้งานrequire('yourpackagename')ต้องกำหนดอย่างไม่น่าสงสัย

ขอบคุณแล้วฉันจะพิจารณาใช้องค์ประกอบเป็นกระบวนการลูก
Gavin

1
หมายเหตุด้านข้าง 1 ให้electronเกียรติพารามิเตอร์หลักคือelectron .เริ่มสิ่งที่ถูกต้องจากโฟลเดอร์ย่อยหากมีเช่น"main": "dist/app/index.js",ในpackage.json(อาจถือเป็นจริงสำหรับแพลตฟอร์ม / กรอบงานอื่น ๆ เช่นกัน)
Frank Nocke

1
หมายเหตุด้านข้าง 2: You can't have two scripts as main...- จริง แต่ถ้าแพคเกจของคุณที่เกิดขึ้นเพื่อให้คำสั่ง CLI ตัวอย่างเช่นหลาย ๆ (ในระหว่างการพัฒนาภายใต้การเข้าถึง./node_modules/.bin/<symlink>) ตรวจสอบ "ถัง" พารามิเตอร์
Frank Nocke

ฉันมี build / index.js แต่ถ้าฉันเปลี่ยนเป็น src / index.js มันจะทำอะไรก็ได้ มันยังคงชี้ไปที่ buld / index ฉันใช้ลิงค์ npm
Carlos

ทุกคนใช้.jsส่วนขยายที่นี่ แต่ "ตัวระบุโมดูล" ไม่มีส่วนขยาย .. ฉันไม่ชอบความกำกวมที่เราควรจะใช้
ChaseMoskal

47

ที่จะตอบคำถามแรกของคุณในแบบที่คุณโหลดโมดูลขึ้นอยู่กับจุดเข้าโมดูลและพารามิเตอร์หลักของpackage.json

สมมติว่าคุณมีโครงสร้างไฟล์ต่อไปนี้:

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

ไม่มีพารามิเตอร์หลักในpackage.jsonrequire('my-npm-module/lib/module.js')คุณต้องโหลดโมดูลโดยให้จุดเข้าโมดูล:

ถ้าคุณตั้งค่าpackage.jsonพารามิเตอร์หลักดังต่อไปนี้คุณจะสามารถที่จะโหลดโมดูลวิธีนี้:"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
ดังนั้นหากรหัสไม่ได้ตั้งใจจะนำเข้าเราสามารถละทิ้งพารามิเตอร์ 'main' ได้หรือไม่
Kokodoko

@ Kokodoko ใช่นั่นคือสิ่งที่แนะนำในกรณีนี้
cquezel

7

ฟังก์ชั่นที่สำคัญอย่างหนึ่งของmainกุญแจคือมันให้เส้นทางสำหรับจุดเข้าของคุณ nodemonนี้จะเป็นประโยชน์อย่างมากเมื่อทำงานร่วมกับ หากคุณทำงานกับnodemonและคุณกำหนดmainที่สำคัญของคุณในpackage.jsonขณะที่ปล่อยให้พูด"main": "./src/server/app.js"แล้วคุณก็สามารถเหวี่ยงขึ้นเซิร์ฟเวอร์ที่มีการพิมพ์nodemonใน CLI ที่มีรากเป็น pwd แทน nodemon ./src/server/app.js


3

เท่าที่ฉันรู้มันเป็นจุดเริ่มต้นหลักของแพ็คเกจโหนด (ไลบรารี) ของคุณสำหรับ npm จำเป็นเฉพาะเมื่อโครงการ npm ของคุณกลายเป็นโหนดแพ็กเกจ (ไลบรารี) ซึ่งสามารถติดตั้งผ่าน npm โดยผู้อื่น


สมมติว่าคุณมีไลบรารีที่มีไฟล์ build /, dist / หรือ lib / ในโฟลเดอร์นี้คุณได้รับไฟล์รวบรวมต่อไปนี้สำหรับห้องสมุดของคุณ:

-lib/
--bundle.js

จากนั้นในpackage.jsonของคุณคุณบอก npm วิธีเข้าถึงไลบรารี (แพ็คเกจโหนด):

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

หลังจากติดตั้งแพ็กเกจโหนดด้วย npm ไปยังโปรเจ็กต์ JS ของคุณคุณสามารถอิมพอร์ตฟังก์ชันการทำงานจากไฟล์บันเดิล. jsของคุณ:

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

สิ่งนี้ถือเป็นจริงเมื่อใช้การแยกรหัส (เช่น Webpack) สำหรับไลบรารีของคุณ ตัวอย่างเช่น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',
  },
  ...
}

แต่ถึงกระนั้นคุณจะกำหนดจุดเข้าหลักหนึ่งไปยังห้องสมุดของคุณในpackage.jsonของคุณ:

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

จากนั้นเมื่อใช้ห้องสมุดคุณสามารถนำเข้าไฟล์จากจุดเข้าหลักของคุณ:

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

อย่างไรก็ตามคุณยังสามารถข้ามจุดเข้าหลักจากpackage.jsonและนำเข้ากลุ่มการแบ่งรหัส:

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

ท้ายที่สุดคุณสมบัติหลักในpackage.jsonของคุณจะชี้ไปที่ไฟล์ entry point หลักของไลบรารีของคุณเท่านั้น


0

สำหรับ OpenShift คุณจะได้รับ PORT และ IP หนึ่งคู่เท่านั้นที่จะผูกกับ (ต่อแอปพลิเคชัน) ดูเหมือนว่าคุณควรจะสามารถให้บริการทั้งสองจากอินสแตนซ์ของ nodejs เดียวโดยการเพิ่มเส้นทางภายในสำหรับแต่ละจุดสิ้นสุดของบริการ

ฉันมีข้อมูลบางอย่างเกี่ยวกับวิธีที่ OpenShift ใช้ package.json ของโครงการเพื่อเริ่มต้นแอปพลิเคชันของคุณที่นี่: https://www.openshift.com/blogs/run-your-nodejs-projects-on-openshift-in-tep-simple-step #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.
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.