как разрешить npm package bin работать с опцией experimental-modules?


Начиная с узла v8. 5. 0, поддержка модулей стиля ES6

import x from 'x'

Был доступен при запуске узла с помощью опции --experimental-modules, как показано ниже:

node --experimental-modules test.mjs

Используя ключ bin в package.json Вы можете легко создать cli tools npm cli, запустив npm link.

К сожалению, при выполнении таким образом узел вызывается без дополнительного флага --experimental-modules.

Как можно использовать модули bin с модулями --experimental-modules?

Вот пример: пример

Bin / healthcheck.mjs

import { connect } from 'amqplib'

let open = connect(process.env.RABBITMQ_URL);

const exit = ({healthy = true}) => {
  return healthy ? process.exit(0) : process.exit(1)
}

open.then(() => {
  exit({healthy: true})
}).catch((e) => {
  exit({healthy: false})
})

Пакет.json

{
  "name": "my-cli",
  "bin": {
    "healthcheck": "./bin/healthcheck.mjs"
  }
}

Бежит...

> npm link
> healthcheck
/usr/local/bin/healthcheck: line 1: import: command not found
/usr/local/bin/healthcheck: line 3: syntax error near unexpected token `('
/usr/local/bin/healthcheck: line 3: `let open = connect(process.env.RABBITMQ_URL);'
2 3

2 ответа:

Вы можете использовать shebang в верхней части скрипта

#!/bin/sh 
":" //# comment; exec /usr/bin/env node --experimental-modules "$0" "$@"

Подробнее здесь: http://sambal.org/2014/02/passing-options-node-shebang-line/

Я не уверен, что вы имели в виду со скриптом bin, но вы можете установить аргумент по умолчанию в пакете.JSON файл, как показано ниже ("start": "node --experimental-modules app.js"):

{
    "name": "test_modules",
    "version": "0.0.2",
    "private": true,
    "scripts": {
        "start": "node --experimental-modules app.js"
     }
},
    "dependencies": {
    "@types/express": "^4.0.39",
    "body-parser": "1.17.x",
    "express": "4.15.x",
    "method-override": "2.3.x"
},
    "repository": {},
    "engines": {
        "node": ">=9.5"
    }
}

PS: Если вы используете код visual studio, вы можете установить флаг отладки и добавить его в файл launch.json внутри объекта configurations:

" runtimeArgs": [ "--experimental-modules", " ${workspaceFolder} / app.JS" ]

PS2: модули должны иметь *.расширение mjs, так что он работает импорт заявление!