Использование require в пакете NPM

#node.js #npm

#node.js #npm

Вопрос:

Я написал пользовательский пакет NPM, который будет запускать для меня издевательский сервер Apollo GraphQL с некоторыми пользовательскими настройками.

В моей /bin папке у меня есть файл, server.js который отвечает за раскрутку сервера.

В package.json я настроил свою команду следующим образом:

 ...
"bin": {
  "mock-server": "./src/server.js"
},
...
  

Поэтому, когда я запускаю команду mock-server из родительского проекта, она выполняет server.js файл.

Пока все хорошо, но проблема в том, что как только я начинаю пытаться требовать зависимости, я сталкиваюсь с этой ошибкой:

 $ use-env mock-server
/Users/dev/projects/share-vde-frontend/node_modules/.bin/mock-server: line 1: syntax error near unexpected token `('
/Users/dev/projects/share-vde-frontend/node_modules/.bin/mock-server: line 1: `const { ApolloServer  } = require("apollo-server");'
error Command failed with exit code 2.
  

Мои знания о написании модулей npm основаны только на том, что я видел в пакетах, которые я использовал в прошлом, так что, возможно, я упускаю что-то важное. Нужны ли мне какие-то особые меры при запросе импорта? Или мне нужно собрать и перенести код? Я использую синтаксис ES6, но я уверен, что любой, кто использует этот пакет, будет на современном Node.js версии (пакет является частным и предназначен только для использования в нашей организации).

Комментарии:

1. Я не думаю, что это ошибка из JavaScript, но из вашей оболочки ; есть ли server.js #! строка, определяющая исполняемый файл для использования?

2. Нет, это не так. Я думал, что это только для сценариев bash. Как я должен это настроить?

3. Теперь это сценарий оболочки, вот что значит сделать его bin исполняемым. Читать docs.npmjs.com/files/package.json#bin .

4. О! Это было недостающее звено. Теперь работает после добавления shabang.

Ответ №1:

Основываясь на комментарии от @jonrsharpe выше, я решил эту проблему, добавив шабанг в начало server.js файла:

 #!/usr/bin/env node
const { ApolloServer } = require("apollo-server");
...
  

Комментарии:

1. Обратите внимание, что это не делает его двоичным исполняемым файлом (и вам также необходимо сделать файл исполняемым с помощью, например chmod u x <file> ), он просто сообщает вашей оболочке, какой исполняемый файл использовать для его запуска.