1

这是我的吞咽任务:

 gulp.task('service-worker', ['clean:sw'], function (cb) {
swPrecache.write(path.join(global.config.offlineRoot, 'sw.js'), {
    staticFileGlobs: [
        global.config.offlineRoot + '/offline/**/*.{js,html,css,png,jpg,jpeg,gif,svg,ttf,woff,woff2}',
        global.config.offlineRoot + '/manifest.json'
    ],
    dynamicUrlToDependencies: {
        '/app-shell': ['lib/views/layouts/app-shell.hbs'],
        '/': [
            'lib/views/layouts/main-layout.hbs',
            'lib/views/index.hbs'
        ]
    },
    runtimeCaching: [

        {
            // See https://github.com/GoogleChrome/sw-toolbox#methods
            urlPattern: /^\/(?!login|admin)/,
            handler: 'networkOnly'
        }


    ],

    stripPrefix: global.config.offlineRoot,
    stripPrefixMulti: {
        "node_modules/": 'scripts/'
    },
    navigateFallback: '/app-shell',
    navigateFallbackWhitelist: [/^\/(?!login|admin)/],
    cacheId: "nodebeats",
    //   importScripts: ['scripts/sw-toolbox/sw-toolbox.js'],
    verbose: true,
    maximumFileSizeToCacheInBytes: 3097152, //3mb
    handleFetch: true//(global.config.env === 'prod')
})
    .then(cb)
    .catch(function () {
        cb();
    });

});

从上面的配置中,登录和管理路由仅使用网络获取,索引路由首先从缓存中提供,但我希望它首先是网络,因为我是从服务器端绑定我的页面。所以动态数据不会在应用程序中复制,除非 ctrl + f5

4

1 回答 1

2

对于那种需要在服务器上动态呈现 Web 内容的用例,我认为这不太sw-precache合适。对于某些类型sw-precache的服务器渲染资源可以派上用场,但只有当服务器渲染的内容依赖于一个或多个本地部分/模板然后在服务器上组合时。(您可以通过 设置该映射。)dynamicUrlToDependencies

对于服务器渲染的内容依赖于本地模板/部分以外的其他内容的情况,比如它依赖于当前登录的用户,sw-precache将没有多大帮助。如果您愿意,您可以sw-toolbox直接使用来处理这种类型的动态内容——类似于networkFirst策略在有网络连接时提供新响应与网络连接时回退到先前缓存的响应之间取得平衡不可用。

于 2016-09-06T17:08:21.533 回答