# 碰到的问题
# 部署
# 关于https配置
使用curl
命令请求koa搭建的服务器,如果传入是curl localhost:3001
这种域名和证书无法对应的,就会出现empty reply from server
的问题,并不是服务器出问题,这种时候在远程服务器搭建好nginx代理,如果nginx层没有设证书,访问的话会出现ssl error
网络无法的问题。因此解决这个问题就是要nginx层设置证书,不能仅仅监听443端口,然后代理proxy_pass https://localhost: 3001
。
- 静态文件通过nginx进行http2传输需要在配置文件指明:
listen 443 ssl htt2
。 - nginx静态资源无法请求,出现403 forbidden:
nguni.conf
中的user nginx
改成user root
。
# 关于docker
- docker-compose解决nginx和服务端渲染web程序的容器化。
- mac环境下docker没有docker0。宿主机ip也不是172.17.0.1,要访问宿主机ip,要通过
docker.for.mac.host.internal
。
# 开发
# 关于服务端渲染
# webpack服务端配置的externals
以及babel中配置antd按需引用
使用antd
时的externals
配置如下:
externals: nodeExternals({
whitelist: /ant-design-vue\/lib\/(.)+\/style\/css/
})
服务端打包时需要外置化node_modules,但是webpack只能处理js,因此antd
相关的css不能外置化,whitelist
中设置antd
相关文件。
antd按需引用时的babel配置如下:
["import", { "libraryName": "ant-design-vue", "libraryDirectory": "lib", "style": "css" }]
libraryDirectory
设置为lib
,因为服务端不能使用es
的引用方式。
# koa服务端热更新
要点如下:
- webpack dev配置的
pulbicPath
设为http://localhost8080
,然后服务端中的的clientManifest
通过axios进行请求。这样clientManifest指向的静态资源路径就是webpack dev server中的静态资源的路径,当相关代码发生改变时,webpack dev server的热更新功能就会令服务端中的页面发生变化。
# 预先加载dll
clientManifest
中有3个部分:all
、async
、initial
,其中initial
是根路由所需要的资源,并且其资源是preload
的,而async
是prefetch
的,dll生成的js代码也是prefetch
的,但是dll中代码包括vue
、axios
等不需要按需引用、不常变化的第三方库,vue
是页面中dom必须比业务代码先引用的运行时代码,不能是prefetch
的,因此在server端代码中将async
中的dll代码移到initial
中。
###关于service worker
# serviceWorker的引入
配置serviceWorker时要注意clientManifest
中不要引用workbox中产生的serviceWorker.js
和precache
文件,否则serviceWorker.js
的逻辑就会在非web worker环境下执行importScripts
造成报错。
# workbox路径配置以及serviceWorker热更新有时失效的问题
workbox的swSrc
路径必须是绝对路径,使用path.join
获得,否则会造成serviceWorker无法热更新的问题。这个问题和webpack的fileSystem有关,webpack的fileSystem是CacheFileSystem,它会将静态资源路径作为一个Set的key,当相关资源发生变化时,就会根据key删除旧的资源并使用新的资源。workbox的injectManifest方法中直接使用传入的swSrc
路径作为参数调用readFile方法,
如果使用相对路径,那么key就是相对路径,但是webpack启动时处理serviceWorker保存的key是绝对路径,这样就导致CacheFileSystem无法根据这个相对路径的key删除旧的资源。但是serviceWorker文件有时候会热更新成功,这是因为CacheFileSystem有个计时机制,默认为6s,6s后就会清除旧的资源,此时就会读取新的资源。
####babel转换和webpack打包之模块化处理service worker与业务代码共同引用的模块
babel中的plugin-transform-runtime可以指定corejs为2,2的意思是并不全局注入es6的一些方法,即不是polyfill。如果没有指定转换的module类型,则会默认转成es6模块。处理Promise的时候,会通过import来引入处理的相关代码,此时,如果共同引用的模块中有module.exports的话,就会导致module.exports和import共同使用的报错。解决方法就是babel中指定sourceType为unambiguous,这样其处理文件时,就会将有import和export的处理为es6模块,其他的则处理为正常的script。因此其处理共同的模块时,碰到module.export就不会再通过import的方式引入处理Promise方法的模块,从而不会报错。也可以将module类型设置为commons,但是这样就会失去tree shaking的好处,因此不建议这么做。
# 关于vue框架
vuex和vue-router的时间?