【问题标题】:How to run service worker locally with Angular如何使用 Angular 在本地运行 service worker
【发布时间】:2019-09-18 04:26:25
【问题描述】:

我正在遵循 Angular 的最佳实践来制作 PWA。 在进行生产构建 (ng build --prod --aot) 之后,我还在 localhost 上从 dist 运行 service worker: http-server -p 8080 -c-1 dist 当我尝试将工作人员与我的 Angular 同步时,使用:

navigator.serviceWorker.ready.then(function(swRegistration) {

            console.log('swReady');
});

什么都没有发生,似乎 SW 没有与 Angular 通信。 使用远程服务器(上传 dist)确实有效。所以似乎问题在于 dist 不适用于ng serve。 我究竟做错了什么?

【问题讨论】:

  • ng 构建文件不能在您的本地主机上运行吗?还是您只引用来自ng serve 的文件?
  • 确实如此。 ng serve 正在工作,但没有与 service worker 通信
  • 服务工作者不在ng serve上工作,使用任何其他服务器,angular.io/guide/…
  • 了解并阅读了该指南。问题是 - 如果不每次都构建和上传,就无法进行测试。没有其他方法可以在本地开发和测试而不构建吗?
  • 您正在运行ng build,然后使用http-server 托管它,我了解ng serve 的重要性。你能解释一下它是如何被使用的吗?另外,您可以发布您的angular.json 文件吗?特别是“配置”->“生产”部分

标签: angular service-worker progressive-web-apps angular-service-worker


【解决方案1】:

目前我们似乎无法将 Service Worker 与 ng serve --prod 一起使用。不过我们可以做一个解决方法。

  1. 我们构建项目ng build --prod

  2. 我们从dist 位置获取ngsw-worker.jsngsw.json 文件并将它们复制到src 文件夹。

  3. 我们修改我们的angular.json 文件以便为他们服务。我们找到 "projects": {"[my-project-name]": {... "architect": {... "build": {... "options": {... "assets": [... 属性,并在其中添加这两项 - "src/ngsw-worker.js", "src/ngsw.json"

  4. 我们服务 – ng serve --prod

我已经达到了这一点。浏览器说软件已激活并正在运行。现在唯一需要考虑的是,如果我们在 SW 中更改某些内容,我们需要再次重建并执行相同的步骤。但我相信我们可以发展得更快。

祝你好运!

【讨论】:

  • --prod 现在退出并显示一条消息,指出该标志已弃用,并建议使用 --configuration production 对我来说失败,因为`错误:预计在 C 中找到一个 ngsw-config.json 配置文件: \Users\username\project` 使用工作箱和 sw.js 文件。
【解决方案2】:

使用 Chrome,您可以启用一个标志来将特定主机视为安全源,从而允许服务人员工作:

./chrome --unsafely-treat-insecure-origin-as-secure=http://your.insecure.site:8080

要从终端启动 chrome,您需要知道可执行文件的位置。这将取决于系统。对于 MacO:

open /Applications/Google\ Chrome.app/ --args  --unsafely-treat-insecure-origin-as-secure=http://your.insecure.site:8080

【讨论】:

  • 感谢@TmKVU。然后,我也可以在使用ng serve 的同时服务它,还是它是死路一条?
  • @Yuvals 你应该可以,我不知道 Angular 的具体情况
【解决方案3】:

注意:这是基于 Ionic 下的 Angular。对于普通的 Angular,一些路径是不同的(例如 www -> dist),应该使用 'ng' 命令而不是 'ionic',因此请进行相应调整。

第 0 步。添加 @angular/pwa,它将创建用于生产的服务工作者(请参阅任何其他说明)。

步骤 1. 在调试构建中启用服务工作者。通常 SW 仅用于生产,例如在两个实现之一的文件src/app/app.module.ts 中,将“启用”更改为true(或者可以将属性“useServiceWorker”添加到“environment.ts”和“environment.production.ts”文件并将它们都设置为“true”,稍后调试完成后,只需将 environment.ts 文件中的设置更改为“false”):

  imports: [ ...
-    ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
+    ServiceWorkerModule.register('ngsw-worker.js', { enabled: true }),
  ],

  imports: [ ...
    ServiceWorkerModule.register('ngsw-worker.js'),
  ],
  providers: [ ...
-    { provide: SwRegistrationOptions, useFactory: () => ({ enabled: environment.production }) },
+    { provide: SwRegistrationOptions, useFactory: () => ({ enabled: true }) },

第 2 步。在package.json 文件中的“脚本”中添加一些挂钩。它们旨在确保 'ngsw.json' 文件中的所有文件哈希都是正确的,并且 SW 可以正确加载文件:

{
    "scripts": { ...
+        "ionic:serve:before": "...(anything already there)... && echo {} > src/ngsw.json && cp www/ngsw.json src/ngsw.json",
+        "ionic:build:after":"...(anything already there)... && npm run ngsw:rebuild",
+        "postbuild": "...(anything already there)... && npm run ngsw:rebuild",
+        "ngsw:rebuild": "ngsw-config www ngsw-config.json && cp www/ngsw.json src/ngsw.json",

为了让ionic serve 选择该文件,它会在预构建步骤中添加一个空白文件src/ngsw.json,并尝试从 www 文件夹复制计算得到的哈希值。如果“离子服务”失败,请确保首先运行“离子构建”。我知道这一步是不确定的,但没有更好的钩子,例如在“ng serve”中 - 有开放的功能请求。

由于 'src/ngsw.json' 是创建/生成的,它不应该在源代码管理/git 下,所以在 '.gitignore' 文件中添加行 '/src/ngsw.json'。

第 3 步。将 Service Worker 源代码和配置添加到您的调试版本中。在文件angular.json 中添加行,将“ngsw-worker.js”和“ngsw.json”复制到 www/(生产构建会自动执行此操作,这将在调试构建期间复制):

{
  "projects": {
    "app": {
      "architect": {
        "build": {
          "options": {
            "assets": [
+              {
+                "glob": "ngsw-worker.js",
+                "input": "node_modules/@angular/service-worker",
+                "output": "."
+              },
+              "src/ngsw.json",
...

第 4 步。构建调试版本(确保 ngsw.json 中的当前哈希值),然后使用 HTTPS 提供服务。 'ionic serve' 有 --ssl 和 --external 选项(--external 允许在例如手机上打开应用程序):

ionic build
ionic ssl generate ;# creates SSL certs in .ionic/ssl/: cert.pem and key.pem
ionic serve --external --ssl

另一种选择是使用任何适当的 HTTP 服务器,它可以为单页应用程序 (SPA) 执行 SSL 和代理。当代理和 ssl 选项混合使用时,包 'http-server' 不能很好地工作,所以使用例如'local-web-server' 代替:

npm install -g local-web-server
ws -p 8100 --cert .ionic/ssl/cert.pem --key ,ionic/ssl/key.pem --https --spa index.html --directory www

第 5 步。将证书添加到您的浏览器 CA 列表。对 Chrome 使用以下步骤(或对其他浏览器使用谷歌):

https://www.nullalo.com/en/chrome-how-to-install-self-signed-ssl-certificates/

完成!打开 Chrome 并导航到 https://localhost:8100,查看已加载 Service Worker 的控制台。如果控制台中有任何错误,请追溯之前的步骤 - 框架变化很快,可能已经有所不同。

【讨论】:

  • 感谢您的解释 - 非常适合使用实时重新加载进行开发:)。只有一个问题:为什么不在angular.json 中使用{"glob": "ngsw.json", "input": "www", "output": "."} 而不是"src/ngsw.json"? (这似乎同样有效,并且避免将复制脚本添加到 package.json 和任何额外的 gitignores)
【解决方案4】:

您不能通过ng serve 为您的 Angular 项目提供服务工作者,因为服务工作者的文档指出它需要https。在服务器上不使用 https/ 运行它的唯一方法是使用 ng build 并运行 http-server locally 来测试您的项目。

由于 ng serve 不适用于服务工作者,因此您必须使用单独的 HTTP 服务器在本地测试您的项目。

【讨论】:

  • 我在本地运行http-server,但问题是ng serve
  • 如文档所述,Angular 的服务工作者未配置为在 ng serve 上工作。唯一的方法是每次需要测试时都构建项目。 :(
  • 这可以让我在本地 HTTP 服务器上运行 ng serve 吗?
  • 抱歉,能否请您重新表述一下您的问题?使用本地 HTTP 服务器运行 ng serve 是什么意思? ng serve 默认已经使用 localhost,也就是你的本地服务器!
  • "它需要 https" - 它只需要一个安全的上下文。本地主机默认被视为一个,然后为开发人员提供unsafely-treat-insecure-origin-as-secure。因此,我建议您改写您的答案,因为实际问题正是 ng serve 工作的方式(或更好:不工作)。
【解决方案5】:

首先,确保在您的 angular.json 文件中存在以下内容:“ServiceWorker”: true

      "configurations": {
        "production": {
          "serviceWorker": true,
          "fileReplacements":
            ...

其次,安装http-server并运行

http-server -p 8080 -c-1 dist/app

第三,您的服务人员可能无法处理 IP 地址。因此,您应该改用以下内容:

http://localhost:8080/

来源:Getting an Angular PWA service worker installed on localhost

【讨论】:

    【解决方案6】:

    如果你想使用其他不支持 TimKVU 回答的浏览器,那么解决方案是使用 ngrok (https://ngrok.com)

    它会为您使用的任何服务器设置安全隧道。你运行它:

    ngrok http 4200

    只需连接到屏幕上显示的域。

    【讨论】:

      猜你喜欢
      • 2020-01-20
      • 2017-12-26
      • 2018-10-06
      • 2019-12-05
      • 1970-01-01
      • 2017-05-20
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多