From 2da8ba84c95ea798ca6b9fec9b57c5d498dc3cac Mon Sep 17 00:00:00 2001 From: rohitpal Date: Sun, 12 Mar 2017 05:25:01 +0530 Subject: [PATCH] offline-plugin-integration initial commit --- examples/offline-nuxt/nuxt.config.js | 4 ++ examples/offline-nuxt/package.json | 8 ++++ examples/offline-nuxt/pages/index.vue | 5 +++ examples/offline-nuxt/plugins/init-offline.js | 3 ++ lib/webpack/client.config.js | 40 +++++++++++++++++++ package.json | 1 + 6 files changed, 61 insertions(+) create mode 100644 examples/offline-nuxt/nuxt.config.js create mode 100644 examples/offline-nuxt/package.json create mode 100644 examples/offline-nuxt/pages/index.vue create mode 100644 examples/offline-nuxt/plugins/init-offline.js diff --git a/examples/offline-nuxt/nuxt.config.js b/examples/offline-nuxt/nuxt.config.js new file mode 100644 index 0000000000..38d7a4050a --- /dev/null +++ b/examples/offline-nuxt/nuxt.config.js @@ -0,0 +1,4 @@ +module.exports = { + offline: true, // true or https://github.com/NekR/offline-plugin/blob/master/docs/options.md + plugins: ['~plugins/init-offline.js'] +} diff --git a/examples/offline-nuxt/package.json b/examples/offline-nuxt/package.json new file mode 100644 index 0000000000..20c76d1b6b --- /dev/null +++ b/examples/offline-nuxt/package.json @@ -0,0 +1,8 @@ +{ + "name": "offline-config-nuxt", + "scripts": { + "dev": "../../bin/nuxt", + "build": "../../bin/nuxt build", + "start": "../../bin/nuxt start" + } +} diff --git a/examples/offline-nuxt/pages/index.vue b/examples/offline-nuxt/pages/index.vue new file mode 100644 index 0000000000..bb1b2bacae --- /dev/null +++ b/examples/offline-nuxt/pages/index.vue @@ -0,0 +1,5 @@ + diff --git a/examples/offline-nuxt/plugins/init-offline.js b/examples/offline-nuxt/plugins/init-offline.js new file mode 100644 index 0000000000..a2b6086a0f --- /dev/null +++ b/examples/offline-nuxt/plugins/init-offline.js @@ -0,0 +1,3 @@ +if (process.BROWSER_BUILD && process.env.NODE_ENV === 'production') { + require('offline-plugin/runtime').install() +} diff --git a/lib/webpack/client.config.js b/lib/webpack/client.config.js index 8cee34438e..46f1a14a45 100644 --- a/lib/webpack/client.config.js +++ b/lib/webpack/client.config.js @@ -7,6 +7,36 @@ import ProgressBarPlugin from 'progress-bar-webpack-plugin' import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' import base from './base.config.js' import { resolve } from 'path' + +// offline plugin copy generated assets to static directory +function OfflinePluginCopyAssetsPlugin(assets, toDir) { + this.assets = assets + this.toDir = toDir +} +OfflinePluginCopyAssetsPlugin.prototype.apply = function(compiler) { + compiler.plugin('after-emit', function(compilation, callback) { + const assets = this.assets.length > 0 ? this.assets : [] + + if (!fs.existsSync(this.toDir)){ + fs.mkdirSync(this.toDir) + fs.mkdirSync(`${this.toDir}/appcache`) + } + + let renamePromises = [] + assets.forEach((asset) => { + renamePromises.push(rename(`.nuxt/dist/${asset}`, `${this.toDir}/${asset}`)) + }) + + Promise.all(renamePromises) + .then(() => { + console.log('\noffline content to static directory...') + }) + .catch((error) => { + console.error('\noffline-plugin copy error', error) + }); + }.bind(this)); +} + /* |-------------------------------------------------------------------------- | Webpack Client Config @@ -85,6 +115,16 @@ export default function () { isClient: true }) } + // Offline-plugin integration + if (!this.dev && this.options.offline) { + const offlineOpts = typeof this.options.offline === 'object' ? this.options.offline : {} + config.plugins.push( + new OfflinePlugin(offlineOpts), + new OfflinePluginCopyAssetsPlugin( + ['sw.js', 'appcache/manifest.appcache', 'appcache/manifest.html' + ], 'static') + ) + } // Webpack Bundle Analyzer if (!this.dev && this.options.build.analyze) { let options = {} diff --git a/package.json b/package.json index 7d860957c6..298a226a87 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,7 @@ "jsdom": "^9.10.0", "json-loader": "^0.5.4", "nyc": "^10.1.2", + "offline-plugin": "^4.6.1", "request": "^2.79.0", "request-promise-native": "^1.0.3", "webpack-node-externals": "^1.5.4"