Vue做了一個單頁面應用,它在一切設備上都工作正常。
在調試另一個dug時,發現了這個問題。
項目在其他端都可以正常打開,只有在paid上打開時,顯示的是白屏狀態。
在剛開始解決這個問題時,花費了好幾個小時都沒解決,都準備從新編譯代碼了。
發現並沒有寫錯,uglify也沒搞錯,錯的是Safari本身。他們在第十七萬一千零四十一號bug中承認了自己的錯誤:
We incorrectly throw a syntax error when declaring a top level for-loop iteration variable the same as a parameter
當你定義一個與參數同名的for循環迭代變量時,我們錯誤地認爲這是一個語法錯誤。
解決方法其實很簡單:
- 進入
build
文件夾; - 找到
webpack.prod.conf.js
文件; - 在
UglifyPlugin
的定義裏添加關於mangle
的選項,使它變成下面這個樣子:
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
},
mangle: {
safari10: true
}
},
sourceMap: config.build.productionSourceMap,
parallel: true
}),
實際上,除此之外,還有另外一個bug
也會影響到vue
網頁在iOS
上的展現,特別是當你用到廣爲流傳的Swiper
插件的時候。這是因爲Swiper
插件中用到了ES6
的語法a = b ** c
,a
是b
的c
次方,而iOS
的Safari
裏不認識這樣的語法,認爲這是一個錯誤,所以你需要讓Swiper
經過babel
的包裝,而缺省狀態下babel
是不對node_modules
裏的模塊進行編譯的。
解決方法是在項目根目錄下新建一個文件vue.config.js
,在裏面添加如下語句:
module.exports = {
chainWebpack: config => {
config.rule('js').include.add(/node_modules\/(dom7|swiper)\/.*/)
}
}