Tham số chính của gói Node.js


147

Tôi đã thực hiện một số tìm kiếm rồi. Tuy nhiên, vẫn còn nghi ngờ về tham số chính trong pack.json của Node.js.

  1. Làm thế nào sẽ điền vào lĩnh vực này giúp? Hỏi theo cách khác, tôi có thể khởi động mô-đun theo một kiểu khác nếu trường này trình bày không?
  2. Tôi có thể có nhiều hơn một tập lệnh được điền vào tham số chính không? Nếu có, họ sẽ được bắt đầu như hai chủ đề? Nếu không, làm thế nào tôi có thể bắt đầu hai tập lệnh trong một mô-đun và để chúng chạy song song?

Tôi biết rằng câu hỏi thứ hai khá kỳ lạ. Đó là bởi vì tôi đã lưu trữ một ứng dụng Node.js trên OpenShift nhưng ứng dụng này bao gồm hai thành phần chính. Một là API REST và một là dịch vụ phân phối thông báo.

Tôi e rằng quy trình phân phối thông báo sẽ chặn API REST nếu chúng được triển khai dưới dạng một luồng. Tuy nhiên, chúng phải kết nối với cùng hộp mực MongoDB. Hơn nữa, tôi muốn lưu một thiết bị nếu cả hai thành phần có thể phục vụ trong cùng một thiết bị nếu có thể.

Mọi góp ý đều được chào đón.

Câu trả lời:


149

Từ tài liệu npm :

Trường chính là ID mô-đun là điểm nhập chính cho chương trình của bạn. Đó là, nếu gói của bạn được đặt tên là foo và người dùng cài đặt nó, sau đó không yêu cầu ("foo"), thì đối tượng xuất khẩu của mô-đun chính của bạn sẽ được trả về.

Đây phải là một ID mô-đun liên quan đến thư mục gốc của gói thư mục của bạn.

Đối với hầu hết các mô-đun, nó có ý nghĩa nhất để có một kịch bản chính và thường không có nhiều khác.

Nói ngắn gọn:

  1. Bạn chỉ cần một maintham số trong package.jsonnếu điểm nhập vào gói của bạn khác với index.jstrong thư mục gốc của nó. Ví dụ, mọi người thường đặt điểm vào đến lib/index.jshoặc lib/<packagename>.js, trong trường hợp này, tập lệnh tương ứng phải được mô tả như maintrong package.json.
  2. Bạn không thể có hai tập lệnh như main, đơn giản vì điểm vào require('yourpackagename')phải được xác định rõ ràng.

Cảm ơn, sau đó tôi sẽ xem xét thực hiện các thành phần như là một quá trình con.
Gavin

1
Side-note 1, electrontôn vinh các thông số chính, tức là electron .không khởi động đúng đắn từ một thư mục con, nếu có một ví dụ một "main": "dist/app/index.js",trong package.json(có thể giữ đúng đối với các nền tảng khác / khung cũng).
Frank Nocke

1
Lưu ý phụ 2: You can't have two scripts as main...- đúng. Tuy nhiên, nếu gói của bạn tình cờ cung cấp ví dụ nhiều lệnh CLI (trong quá trình phát triển có thể truy cập bên dưới ./node_modules/.bin/<symlink>), hãy kiểm tra tham số "bin" .
Frank Nocke

Tôi có build / index.js nhưng nếu tôi thay đổi thành src / index.js thì nó sẽ làm được mọi thứ. nó vẫn chỉ vào buld / index. Tôi đang sử dụng liên kết npm
Carlos

tất cả mọi người đang sử dụng .jstiện ích mở rộng ở đây, nhưng "số nhận dạng mô-đun" không có tiện ích mở rộng .. tôi không thích sự mơ hồ về việc chúng tôi sẽ sử dụng
ChaseMoskal

47

Để trả lời câu hỏi đầu tiên của bạn, cách bạn tải một mô-đun phụ thuộc vào điểm nhập mô-đun và tham số chính của gói.json .

Giả sử bạn có cấu trúc tệp sau:

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

Không có tham số chính trong gói.json , bạn phải tải mô-đun bằng cách đưa ra điểm nhập mô-đun : require('my-npm-module/lib/module.js').

Nếu bạn đặt tham số chính pack.json như sau "main": "lib/module.js", bạn sẽ có thể tải mô-đun theo cách này : require('my-npm-module').


20

Nếu bạn có ví dụ trong package.jsontập tin của bạn :

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

lib/entry.js sẽ là điểm nhập cảnh chính cho gói của bạn.

Khi gọi

require('zig-zag');

trong nút, lib/entry.jssẽ là tập tin thực tế được yêu cầu.


1
Vì vậy, nếu mã không có nghĩa là được nhập, chúng ta có thể bỏ tham số 'chính' không?
Kokodoko

@Kokodoko vâng, đó là những gì được đề xuất trong trường hợp này
cquezel

7

Một chức năng quan trọng của mainkhóa là nó cung cấp đường dẫn cho điểm vào của bạn. Điều này rất hữu ích khi làm việc với nodemon. Nếu bạn làm việc với nodemonvà bạn xác định mainkhóa trong package.jsonví dụ của mình "main": "./src/server/app.js", thì bạn có thể chỉ cần khởi động máy chủ bằng cách nhập nodemonCLI với root là pwd thay vì nodemon ./src/server/app.js .


3

Theo như tôi biết, đó là điểm vào chính của gói nút (thư viện) của bạn cho npm. Nó chỉ cần thiết nếu dự án npm của bạn trở thành gói nút (thư viện) có thể được cài đặt qua npm bởi những người khác.


Giả sử bạn có một thư viện với thư mục build /, dist / hoặc lib /. Trong thư mục này, bạn đã nhận được tệp được biên dịch sau đây cho thư viện của mình:

-lib/
--bundle.js

Sau đó, trong gói.json của bạn , bạn cho npm biết cách truy cập thư viện (gói nút):

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

Sau khi cài đặt gói nút với npm vào dự án JS của bạn, bạn có thể nhập các chức năng từ tệp bundle.js được đóng gói của mình :

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

Điều này cũng đúng khi sử dụng Chia tách mã (ví dụ Webpack) cho thư viện của bạn. Chẳng hạn, webpack.config.js này sử dụng mã chia dự án thành nhiều gói thay vì một.

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

Tuy nhiên, bạn sẽ xác định một điểm nhập chính vào thư viện của bạn trong gói.json :

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

Sau đó, khi sử dụng thư viện, bạn có thể nhập tệp của mình từ điểm nhập chính:

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

Tuy nhiên, bạn cũng có thể bỏ qua điểm nhập chính từ gói.json và nhập các gói được chia mã:

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

Rốt cuộc, thuộc tính chính trong gói.json của bạn chỉ trỏ đến tệp điểm nhập chính của thư viện của bạn.


0

Đối với OpenShift, bạn chỉ có một cặp PORT và IP để liên kết (trên mỗi ứng dụng). Có vẻ như bạn sẽ có thể phục vụ cả hai dịch vụ từ một cá thể nodejs bằng cách thêm các tuyến nội bộ cho mỗi điểm cuối dịch vụ.

Tôi có một số thông tin về cách OpenShift sử dụng gói.json của dự án của bạn để bắt đầu ứng dụng của bạn tại đây: https://www.openshift.com/bloss/run-your-nodejs-projects-on-openshift-in-two-simple-steps #package_json


-5

Chỉ cần nghĩ về nó như là "điểm khởi đầu".

Theo nghĩa lập trình hướng đối tượng, giả sử C #, đó là init () hoặc hàm tạo của lớp đối tượng, đó là "điểm vào" nghĩa là gì.

Ví dụ

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

    ...   // many others such as function, properties, etc.
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.