在 angular2 快速入门指南中使用 lite-server 打开非默认浏览器

Opening non-default browser with lite-server in angular2 quick start guide

遵循 Angular 2 Quick Start guide 的 TypeScript 版本后,我想知道是否可行,如果可行,如何配置 lite-server 以启动默认浏览器以外的浏览器。

lite-server 似乎会接受命令行参数,通过 yargs.argv 提供给它。并且 yargs 似乎将尝试根据相当通用的标准解析命令行参数(即,如果标记以 -- 开头,则它表示参数名称,否则表示参数值)以获得 argv. lite-server 将尝试使用它从 argv 获得的 open 属性,这最终是通过 [启动进程的节点包之一] 启动浏览器的。节点开放? xdg-打开?不确定,现在对我来说并不那么重要,只要我的假设(基于对这些进程启动器中的几个的观察)是正确的,它们都可以选择使用一个参数来定义要启动的进程。如果省略,将使用默认浏览器,因为要打开的文件类型是 html,这就是发生的情况。

如果所有这些都是正确的,或者至少是它的要点,那么我似乎只需要指定 --open chrome,例如(假设 chrome 在我的 PATH - 在 win 机器上工作 btw),在 package.json.

中定义的 lite 命令的末尾

所以像...

"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\" "
},

如果这看起来毫无意义,我深表歉意,但我不会在电脑前测试几天,我需要知道我是否有答案并且可以停止研究它:)。谢谢!

lite-server 实际上是在使用 browser-sync,因此您应该可以使用 --browser CLI command

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

更新

lite-server 项目已更新为包含可配置的浏览器选择。我只是为了历史目的而留下这个,并支持安德的回答。


lite-server has been looking to address the issue 的创建者以某种标准方式配置所有 browser-sync 选项(建议使用 .rc 文件)。所以这个问题和答案在您阅读时可能已经过时了。


谢谢 Sasxa 指出这一点...

lite-server is actually using browser-sync ...

这对于为这个特定问题提出解决方案至关重要(有点尴尬,我忽略了或注销为微不足道的 var sync = require('browser-sync').create(); ... sync.init())。

但是,该答案将无法正常工作,因为这...

... so you should be able to use --browser CLI command for that.

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

...开箱即用。事实证明,lite-server 没有对 yargs 用于解析的 browser 参数做任何事情。我几乎编辑了 Sasxa 的答案,但认为它分歧太大,因为你真的不能使用 browser-sync CLI。 lite-server 已经在使用 browser-sync API。特别是,需要在此处指定 init() is being called, and the browser 选项。关于 browser 命令行参数,Angular 2 快速入门指南的 package.jsonbrowser-sync 之间完全脱节。


修复:

受 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
  };

然后,当调用browser-sync的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 快速入门 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 实际启动。我需要使用 "chrome",而 docs 说“google chrome”...

// Open the site in Chrome

browser: "google chrome"

// Open the site in Chrome & Firefox

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

命令行 open 参数 lite-server 使用,作为 startPath 传递给 browser-syncbrowser 对于指定要启动的所需浏览器似乎是规范正确的,因为它最终在 browser-sync 中被该名称使用。此外,关于这一点,Sasxa 的回答是错误的,假设 --open local 会毫发无损地到达 browser-sync。这实际上会导致路径损坏,因为它被 lite-server 消耗,并转换为类似 \local\index.html 的路径,而不是 \.\index.html 如果未指定。

最近的更改 (@2.1.0) 让您可以通过 bs-config.json:

设置您的配置,包括浏览器
{
  "browser": "chrome"
}

{
  "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-server 维护者的意图。这是当前的 lite-server.js 文件以供参考。

对于Windows(和Mac)新手(而不是新手:): 您的第一个冲动可能是在您的项目目录中查找 'bs-config.json'。你不会找到它。你需要在项目根目录下创建一个文件并命名为bs-config.json.在其中,您可以根据上述答案指定您喜欢的浏览器 - 即:{"browser": "chrome" }

原因是文件lite-server.js寻找上面的配置文件;如果找不到它,它会使用精简服务器默认设置,在 Windows 系统上默认使用 Internet Explorer。

在您的项目文件夹中创建一个文件名 "bs-config.json" 并将以下代码添加到该文件中:

{
"browser": ["chrome","firefox"]         //to make chrome to default browser
}

对于 MacOS,我必须在 "bs-config.json" 文件中使用区分大小写的值:

{
  "browser": "Google Chrome"
}

使用 Debian/Ubuntu 和 update-alternatives

我能够确认您可以通过此 command here. Currently lite-server uses browser-sync which uses opn which bundles its own copy of a xdg-open 全局更改此过程。您可以使用

配置它
sudo update-alternatives --config x-www-browser

我发现它更可取。它对所有 angular2 示例都有效,并且对 OS 的其余部分也有效。您还可以让 link 以隐身方式打开(上面 link 中的说明)。