Открытие браузера не по умолчанию с lite-сервером в кратком руководстве angular2

Следуя версии TypeScript Краткого руководства по Angular 2, я задался вопросом, возможно ли это, и если да, то как настроить lite-сервер для запуска браузера, отличного от используемого по умолчанию.

Кажется, lite-сервер будет принимать аргументы командной строки, переданные ему через yargs.argv. И кажется, что yargs попытается проанализировать аргументы командной строки на основе довольно распространенных стандартов (т. Е. Если токен начинается с --, он представляет имя аргумента, иначе значение аргумента), чтобы получить argv. lite-server попытается использовать свойство open, полученное от argv, что в конечном итоге и запускает браузер через [один из пакетов узла, который запускает процессы]. узел открыт? xdg-открыть? Не уверен, на самом деле это не так важно для меня прямо сейчас, если мое предположение (основанное на рассмотрении нескольких из этих средств запуска процессов) верно, что все они необязательно принимают аргумент, определяющий процесс для запуска. Если его не указать, будет использоваться браузер по умолчанию, поскольку тип открываемого файла — html, что и происходит.

Если все это правильно или, по крайней мере, суть этого, то, похоже, мне просто нужно указать --open chrome, например (при условии, что хром находится в моем PATH - кстати, работает на машине с выигрышем), в конце определенной команды lite в package.json.

Так что-то вроде...

"scripts": {
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "lite": "lite-server",
    "lite:c": "lite-server --open chrome",
    "lite:f": "lite-server --open firefox ",
    "start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
},

Прошу прощения, если это покажется бессмысленным, но меня не будет за компьютером, где я смогу протестировать это, в течение нескольких дней, и мне нужно знать, есть ли у меня ответ, и могу ли я перестать это исследовать :). Спасибо!


person Eric Lease    schedule 16.01.2016    source источник
comment
Возможно, вы захотите настроить это глобально, вы можете найти мои инструкции в ответе на этот вопрос (а также разъяснение того, что происходит). stackoverflow.com/a/42797387/124486   -  person Evan Carroll    schedule 15.03.2017


Ответы (7)


Недавние изменения (@2.1.0) позволяют вам устанавливать свои конфигурации, включая браузер(ы), через bs-config.json:

{
  "browser": "chrome"
}

or

{
  "browser": ["chrome","firefox"]
}

Если вы хотите настроить отдельные скрипты для каждого браузера, вы можете сделать следующее в своем package.json:

{
  "scripts": {
    "lite": "lite-server",
    "lite:ff": "lite-server --c bs-firefox.json",
    "lite:c": "lite-server --c bs-chrome.json",
    "lite:ie": "lite-server --c bs-ie.json",
    "lite:all": "lite-server --c bs-all.json"
  }
}

Хотя это не лучшее решение, поскольку вам нужно копировать и поддерживать свою конфигурацию в нескольких файлах, похоже, это то, что задумал сопровождающий lite-сервера. Вот текущий lite -server.js для справки.

person ender    schedule 21.03.2016
comment
Благодарю вас! Я работал над другими проектами, и у меня не было возможности следить за этим, и я еще не проверил ваш ответ. Тем не менее, я знаю, что в работе произошли изменения, и это похоже на проблему на github, поэтому я изменил это на принятый ответ. - person Eric Lease; 23.03.2016
comment
Это должны быть расширения .js, а не .json для конфигурации. сценарии: { dev: tsc && одновременно \npm run tsc:w\ \lite-server --c bs-dev.js\ , prod: tsc && одновременно \npm run tsc:w\ \lite-server --c bs- prod.js\, } - person CountZero; 19.05.2016
comment
В Mac OS X мне нужно было создать файл bs-config.json со следующим содержимым: {browser: google chrome} - person richardsun; 15.06.2016
comment
Только одно уточнение: файл bs-config.json должен находиться в корне вашего проекта или, по сути, в той же папке, что и ваш package.json. - person Todd Palmer; 01.12.2016
comment
Я считаю, что это должно быть {browser: google chrome}, а не {browser: chrome}. макОС. - person Shakespear; 31.12.2018

ОБНОВЛЕНИЕ

Проект lite-server был обновлен, чтобы включить настраиваемый выбор браузера. Я оставляю это только для исторических целей и поддерживаю ответ Эндера.


Создатель lite-server ищет решение проблемы настройки всех browser-sync параметров. стандартным способом (рекомендуется .rc файл). Так что этот вопрос и ответ могут устареть к тому времени, когда вы его прочитаете.


Спасибо, Sasxa, что указали на это...

lite-server на самом деле использует browser-sync ...

Это было важно при поиске решения этой конкретной проблемы (немного стыдно, что я упустил из виду или списал как тривиальное var sync = require('browser-sync').create(); ... sync.init()).

Однако этот ответ не будет работать как есть, потому что это...

... поэтому вы должны иметь возможность использовать для этого --browser команду CLI.

"lite:c" : "lite-server --browser chrome --open local"

... не работает из коробки. Как оказалось, lite-server ничего не делает с аргументом browser, который yargs используется для разбора. Я почти отредактировал ответ Sasxa, но решил, что он слишком сильно расходится, поскольку вы действительно не можете использовать browser-sync CLI. lite-server уже использует browser-sync API. В частности, вызывается init(), а browser там нужно указать опцию. Существует полное несоответствие между package.json и browser-sync руководства по быстрому запуску Angular 2 в отношении аргумента командной строки browser.


Исправление:

Поэтому, вдохновленный ответом Sasxa, аргумент browser будет передан yargs.argv со значением chrome.

lite-server.js необходимо изменить, чтобы передать его browser-sync. Это можно добавить как свойство объекта options...

var options =
  {
    openPath: openPath,
    files: argv.files ? argv.files : [
      openPath + '/**/*.html',
      openPath + '/**/*.css',
      openPath + '/**/*.js'
    ],
    baseDir: argv.baseDir || './',
    fallback: '/' + openPath + '/index.html',
    browser: argv.browser || "default" // add this line, ~line 24
  };

Затем, когда вызывается браузерная синхронизация init(), укажите параметр browser.

sync.init({
  port: argv.port || 3000,
  server: {
    baseDir: options.baseDir,
    middleware: [
      log(),
      historyFallback({ index: options.fallback })
    ]
  },
  files: options.files,
  browser: options.browser // add this line, ~line 49
});

Теперь, возвращаясь к Angular 2 Quick Start package.json, можно использовать следующие значения аргумента для аргумента browser:

  • chrome
  • firefox
  • iexplore

вот так...

"scripts": {
    "tsc": "tsc",
    "tsc:w": "tsc -w",

    "lite": "lite-server",
    "lite:c": "lite-server --browser \"chrome\"",
    "lite:ff": "lite-server --browser \"firefox\"",
    "lite:ie": "lite-server --browser \"iexplore\"",
    "lite:garbage": "lite-server --browser \"garbage\"",

    "start": "concurrent \"npm run tsc:w\" \"npm run lite:c\" ",

    "//": "start default browser:",
    "//": "concurrent \"npm run tsc:w\" \"npm run lite\" ",
    "//": "start chrome:",
    "//": "concurrent \"npm run tsc:w\" \"npm run lite:c\" ",
    "//": "start firefox:",
    "//": "concurrent \"npm run tsc:w\" \"npm run lite:ff\" ",
    "//": "start ie:",
    "//": "concurrent \"npm run tsc:w\" \"npm run lite:ie\" ",
    "//": "if you want to see an invalid browser arg value, try...",
    "//": "concurrent \"npm run tsc:w\" \"npm run lite:garbage\" "
},

Некоторые заключительные мысли

Возможно, вам придется использовать "google chrome" в качестве значения browser, чтобы хром действительно запускался. Мне нужно было использовать "chrome", тогда как в документах указано google chrome...

// Открываем сайт в Chrome

browser: "google chrome"

// Откройте сайт в Chrome и Firefox

browser: ["google chrome", "firefox"]

Аргумент командной строки open используется lite-server как часть startPath, передаваемого browser-sync. browser кажется канонически правильным для указания желаемого браузера для запуска, поскольку в конечном итоге он используется под этим именем в browser-sync. Кроме того, в отношении этого ответа Сакса был неверным, предполагая, что --open local доберется до browser-sync целым и невредимым. Это фактически приведет к повреждению пути, потому что он используется lite-сервером и преобразуется в путь, подобный \local\index.html, вместо \.\index.html, если он не указан.

person Eric Lease    schedule 18.01.2016

Для MacOS мне пришлось использовать значение с учетом регистра в файле «bs-config.json»:

{
  "browser": "Google Chrome"
}
person Scott S    schedule 26.01.2017
comment
это сработало для меня. используя MacOS, я сначала добавил браузер: chrome в bs-config.json, что не сработало. (я получил следующее сообщение об ошибке: [Browsersync] Не удалось открыть браузер (если вы используете BrowserSync в автономной среде, вы можете установить для параметра открытия значение false)) - person Minjeong Choi; 22.06.2020

lite-server на самом деле использует browser-sync, поэтому вы должны иметь возможность использовать --browser команду CLI для этого .

"lite:c" : "lite-server --browser chrome --open local"
person Sasxa    schedule 16.01.2016
comment
Посмотрев документы для синхронизации браузера, я уверен, что вы правы. Я думаю, что эта строка из github readme сбила меня с толку... работает путем внедрения тега асинхронного скрипта (‹script async›...‹/script›. Я предположил, что это была единственная цель пакета, и это произошло после браузер уже запущен +1 на данный момент, но я совершенно уверен, что приму этот ответ, как только проверю. - person Eric Lease; 16.01.2016
comment
brsync великолепен, один из лучших пакетов перезагрузки в реальном времени, с которыми я работал (он может синхронизировать экраны на многих устройствах/браузерах, которые вы используете для просмотра своих страниц). Если вы используете его в качестве сервера, вам не нужно добавлять какие-либо сценарии в свой код, но есть фрагмент, который нужно добавить, если вы обслуживаете файлы с другого сервера (я использую сервер разработки wamp и google app engine) и по-прежнему используете live- функция перезагрузки. - person Sasxa; 16.01.2016
comment
Еще раз спасибо, но это не сработало как есть. Это ведет меня в правильном направлении. +1 все еще в силе, потому что вы единственный, кто ответил, и я уверен, что ваш совет сэкономил мне время. Для справки я отправляю ответ сам. - person Eric Lease; 18.01.2016

Создайте имя файла «bs-config.json» в папке вашего проекта и добавьте в этот файл приведенный ниже код:

{
"browser": ["chrome","firefox"]         //to make chrome to default browser
}
person Sanjib Debnath    schedule 06.01.2017

Для новичков в Windows (и Mac) (и не очень новичков :): вашим первым импульсом может быть поиск 'bs-config.json' в каталоге вашего проекта. Вы не найдете его. Вам нужно создать файл в корневом каталоге проекта и назвать его bs-config.json. В нем вы указываете предпочитаемый браузер в соответствии с приведенным выше ответом, т.е.: {"browser": "chrome" }

Причина в том, что файл lite-server.js ищет указанный выше файл конфигурации; если он не находит его, он использует значения по умолчанию для облегченного сервера, по умолчанию Internet Explorer в системах Windows.

person jpumar    schedule 23.09.2016

Использование Debian/Ubuntu и update-alternatives

Мне удалось подтвердить, что вы можете глобально изменить этот процесс с помощью этой команды здесь. В настоящее время lite-server использует browser-sync, который использует opn который связывает собственную копию xdg-open. Вы можете настроить это с помощью

sudo update-alternatives --config x-www-browser

Я нашел это предпочтительным. Он действует на все примеры angular2 и сохраняется и для остальной части ОС. Вы также можете сделать так, чтобы ссылки открывались в режиме инкогнито (инструкция по ссылке выше).

person Evan Carroll    schedule 14.03.2017