1. 如果想编写一个libray的库,代码结构如下:
-library -src -index.js -math.js -string.js
math.js
export function add(a, b) { return a + b; } export function minus(a, b) { return a - b; } export function multiply(a, b) { return a * b; } export function division(a, b) { return a / b; }
string.js
import _ from 'lodash'; export function join(a, b) { return _.join([a, b], ' '); }
index.js
import * as math from './math'; import * as string from './string'; export default { math, string }
为了使用下面方式引入:
import library from 'library'; const library = require('library'); require(['library'],function(){ }) <script src="library.js"></script>
需在配置文件中定义:
const path = require('path'); module.exports = { mode: 'production', entry: './src/index.js', externals: 'lodash', output: { path: path.resolve(__dirname, 'dist'), filename: 'library.js', library: 'root', //在这里定义可以使用 script标签引入 然后注入一个全局吧变量root 使用root.math libraryTarget: 'umd' //使用这种定义可以支持 cmd es6 等语法的引入 } }
则调用方式是 library.math;
2 如果我们写的库中 已经引入打包过 lodash.js这个库,但是用户也在业务代码中引入了这个库,造成了重复引入。所以要在配置文件中设置 externals: 'lodash', 即 打包时不打包依恋文件
3 结合pwa:
//对线上代码做pwa处理,本地开发不用,所以在生成的dist目录下执行 http-server 服务 首先安装 http-server,然后执行: "scripts": { "start": "http-server dist" }, npm install workbox-webpack-plugin --save-dev 在线上打包的配置文件中 const WorkboxPlugin = require('workbox-webpack-plugin'); plugins: [ new WorkboxPlugin.GenerateSW({ clientsClaim: true, skipWaiting: true }) ], 页面代码中: console.log('hello, this is dell'); if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/service-worker.js') //调用打包生成的 sw.js .then(registration => { console.log('service-worker registed'); }).catch(error => { console.log('service-worker register error'); }) }) }
具体:
webpack 中使用 workbox 实现 PWA
说明
重要文件版本
“workbox-webpack-plugin”: “^3.0.0” “webpack”: “^3.11.0” webpack 提供了 workbox 插件 workbox-webpack-plugin webpack 中使用 在 production 版本配置中使用 1. 在入口 html 模板中引入
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge,chrome=1"> <title>webpack-react-template</title> <!-- 引入 manifest 文件 --> <link rel="manifest" href="./manifest.json"> </head> <body> <div id="app"></div> <script> // 进行 service-wroker 注册 if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker .register('./service-wroker.js') .then(registration => { console.log('SW registered: ', registration); }) .catch(registrationError => { console.log('SW registration failed: ', registrationError); }); }); } </script> </body> </html>
2. webpack.prod.config.js 中进行 webpack 配置
const WorkboxPlugin = require('workbox-webpack-plugin'); module.exports = merge(baseWebpackConfig, { // ... 省略其他配置 plugins: [ // ... 省略其他配置 /* 这里也可以使用 WorkboxPlugin.InjectManifest({}) 配置 但是需要 配置 swSrc 指明模板 service-worker 文件 WorkboxPlugin.GenerateSW({}) 可以直接生成 service-worker 文件 */ new WorkboxPlugin.GenerateSW({ cacheId: 'webpack-pwa', // 设置前缀 skipWaiting: true, // 强制等待中的 Service Worker 被激活 clientsClaim: true, // Service Worker 被激活后使其立即获得页面控制权 swDest: 'service-wroker.js', // 输出 Service worker 文件 globPatterns: ['**/*.{html,js,css,png.jpg}'], // 匹配的文件 globIgnores: ['service-wroker.js'], // 忽略的文件 runtimeCaching: [ // 配置路由请求缓存 { urlPattern: /.*\.js/, // 匹配文件 handler: 'networkFirst' // 网络优先 } ] }) ] });
注意:配置路由请求缓存,请看另外一篇文章
3. 转移 manifest.json 以及需要的图片 我这里使用了 copy-webpack-plugin 插件用于文件转移
new CopyWebpackPlugin([ { from: 'src/manifest.json', to: 'manifest.json' }, { from: 'src/icon.png', to: 'static/imgs/icon.png' } ]);
4. 编译后生成的 service-worker 文件
importScripts( 'https://storage.googleapis.com/workbox-cdn/releases/3.0.0/workbox-sw.js' ); importScripts('/test/precache-manifest.14cde9ce3f3a728b83652a5461e9fd24.js'); workbox.core.setCacheNameDetails({ prefix: 'webpack-pwa' }); workbox.skipWaiting(); workbox.clientsClaim(); self.__precacheManifest = [].concat(self.__precacheManifest || []); workbox.precaching.suppressWarnings(); workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); workbox.routing.registerRoute( /.*\.js/, workbox.strategies.networkFirst(), 'GET' );
文章来源:
webpack 中使用 workbox 实现 PWA
相关文章 PWA 渐进式网络应用 - 1 - 简介及调试方法
PWA 渐进式网络应用 - 3 - manifest.json 添加应用至桌面
5. devServer 开启代理:
我们在本地开发的时候经常会访问到测试服务器等接口,但是如果写的是相对路径,比如:
axios.get('/react/api/header.json') .then((res) => { console.log(res); })
就会自动调用 http://localhost:8080/react/api/header.json ;这样就会导致跨域。
所以需要做devserver的代理:
devServer: { proxy: { '/react/api': 'http://www.dell-lee.com' //如果请求的接口是 react/api 则去 dell-lee.com 域名下去访问该接口 } }
如有多个路径需要配置:
devServer: { proxy: [{ context:['/auth','/api'], target:'http://localhost:3000' }] }
如果相对根路径进行配置,需要设置index 为空:
devServer: { proxy: { index:'', '/': 'https://www.dell-lee.com' } }
如需更多的代理配置项,需要增加参数:
devServer: { proxy: { '/react/api': { target: 'https://www.dell-lee.com', //如果请求的接口是 react/api 则去 dell-lee.com 域名下去访问该接口 secure: false, //如果上面用的是https的话 需要设置secure pathRewrite: { 'header.json': 'demo.json' //如果请求的四header.json 则替换成 demo.json }, changeOrigin: true,//突破原网站对代理的限制 headers: { //设置请求头 host: 'www.dell-lee.com', cookie:'123' } } } }
更多配置详见官网文档: https://webpack.js.org/configuration/dev-server
6 devserver 如果不做配置,使用路由跳转页面的时候,比如想访问 localhost:8080/list 这个路径会报错,因为他以为是要访问这个路径,但是是单页面应用,所以需要在devserver中配置:
devServer: { historyApiFallback:true }
这样的话,访问任何的路径(后端服务器没有的路径)都会跳转到 当前的根路径。上线后 需要后端修改ngnix或者apaqi服务器上设置(找不到页面跳转到首页)