Как добавить хеш-банг в исполняемый файл Javascript, не нарушая поддержку браузера?

Можно ли иметь такой код:

#! /usr/local/bin/node
console.info("Hello world")

Что я также могу запустить в браузере?

У меня есть скрипт, который я запускаю локально, и я хочу запустить его в браузере, но сейчас мне нужно «перекомпилировать» его для цели браузера только для удаления строки hashbang.

Я не могу придумать, как это обойти. Есть идеи?

Редактировать: мое использование заключается в том, что я не хочу иметь 2 файла, так как я хочу иметь возможность выполнять текущий файл во время работы над ним, а также обслуживать его через Интернет. Я думаю, что решение должно состоять в том, чтобы либо скомпилировать его для браузера во второй файл, либо использовать альтернативу #! это хорошо работает с javascript.

У вас есть скрипт с #! /usr/local/bin/node, который просто вызывает другой файл и использует этот файл в браузере?

VLAZ 29.05.2019 06:25

Обратите внимание, что это официально называется shebang, вы можете найти лучший результат поиска по этому ключевому слову.

Ferrybig 29.05.2019 08:10

Спасибо @Ferrybig, но не могли бы вы уточнить, что вы подразумеваете под «официально»?

Breck 31.05.2019 01:43

@Breck Просто сравните поисковые тренды от Google, и вы обнаружите, что использование термина shebang значительно превосходит использование термина hashbang. Оба термина технически правильны, но shebang является стандартным.

B. Fleming 31.05.2019 01:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы когда-либо использовали только bash, вы можете воспользоваться одной функцией (?!) bash: bash выполняет скрипты без шебанга, используя bash. Другие оболочки могут оставить это на усмотрение ОС, которая вместо этого обычно использует /bin/sh. Например:

bash-5.0$ echo 'echo $1 $BASH_VERSION' > foo.sh
bash-5.0$ for sh in sh bash dash ksh zsh; do $sh -c "./foo.sh $sh"; done
sh 3.2.57(1)-release
bash 5.0.7(1)-release
dash 3.2.57(1)-release
ksh
zsh 3.2.57(1)-release

(/bin/sh это ссылка на старую версию bash для macOS.)

Итак, у вас может быть такой файл:

///usr/local/bin/node <(tail -n +1 "$0"); exit $?
console.info("Hello world")

Если вы запустите это в браузере или другом средстве запуска JavaScript, первая строка должна быть проигнорирована как комментарий.

Если вы запустите это как скрипт в bash, первая строка говорит ему запустить ///usr/local/bin/node, используя подстановку процесса с tail, чтобы передать остальную часть файла узлу, а затем завершает работу:

bash-5.0$ cat foo.js
///usr/local/bin/node <(tail -n +1 "$0"); exit $?
console.info("Hello world")
bash-5.0$ ./foo.js
Hello world

Этот трюк может работать и с ksh. /// в начале пути не должно вызывать проблем — три или более / в начале пути эквивалентны одному /.

Но я бы настоятельно рекомендовал вам вместо этого использовать скрипт-оболочку, как это предлагается в комментариях.

Вот такой умный лайфхак я и искал! Я только что сделал: "///usr/local/bin/node имя файла; выход;" что гарантировало, что я получил правильный cwd. Теперь, если вы извините меня, я собираюсь добавить шаг сборки и сделать все «правильным» способом. Но счастье есть.

Breck 03.06.2019 18:13

Другие вопросы по теме