看到 vue-cli3 和 framework7 都升級到3.0了,團隊打算用新版本作些新東西.
有 https://github.com/framework7... 和 vue-cli3 中文文檔的加成, 開始還算順利, npm run serve
也能把項目跑起來. 可是 npm run build
打包的時候發生問題了. 報錯以下:css
ERROR Error: CSS minification error: Parse error on line 1: 8px + constant(safe-area-i ------^ Expecting 'SUB', 'LPAREN', 'NESTED_CALC', 'NUMBER', 'CSS_VAR', 'LENGTH', 'ANGLE', 'TIME', 'FREQ', 'RES', 'EMS', 'EXS', 'CHS', 'REMS', 'VHS', 'VWS', 'VMINS', 'VMAXS', 'PERCENTAGE', got 'PREFIX'. File: chunk-vendors.842c282c.css Error: CSS minification error: Parse error on line 1: 8px + constant(safe-area-i ------^ Expecting 'SUB', 'LPAREN', 'NESTED_CALC', 'NUMBER', 'CSS_VAR', 'LENGTH', 'ANGLE', 'TIME', 'FREQ', 'RES', 'EMS', 'EXS', 'CHS', 'REMS', 'VHS', 'VWS', 'VMINS', 'VMAXS', 'PERCENTAGE', got 'PREFIX'. File: chunk-vendors.842c282c.css at D:\work\mobile3\node_modules\@intervolga\optimize-cssnano-plugin\index.js:106:21 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! mobile3@0.1.0 build: `vue-cli-service build` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the mobile3@0.1.0 build script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\zz\AppData\Roaming\npm-cache\_logs\2018-08-16T05_07_51_763Z-debug.log
首先觀察這是一個 CSS minification 的報錯, 說是 calc 函數沒有收到正確的值.
再以報錯信息 8px + constant(safe-area-i
搜索 f7 的 css 文件 發現不少這樣的代碼:html
padding-left: calc(8px + constant(safe-area-inset-right)); padding-left: calc(8px + env(safe-area-inset-right));
而後搜索 safe-area-inset-right
, 發現這是一個 iPhone X (有文章: http://www.css88.com/archives... )的屬性, 做用是用來解決iPhone X 額頭的凹槽帶來的問題.
再以 constant
爲關鍵字去搜索 vue-cli3 的issue.
https://github.com/vuejs/vue-... 尤大表示是 cssnano 的問題
https://github.com/framework7... framework7 的做者表示這是 ios 必須的, 不是個人錯, 請向 cssnano 提出問題.
https://github.com/cssnano/cs... cssnano 說 safe-area-inset-right 這個屬性是非標準的, 是蘋果 iPhone x 私有的, 並且也不是個人鍋, 你看看 reduce-css-calc 吧
https://github.com/MoOx/reduc... reduce-css-calc 表示知道,但沒有解決vue
總結一下, f7 使用了一個iPhone x 專用的非標準 css 屬性, 致使 cssnano 中一個處理 calc 的小插件標錯.node
首先想到的是取消 cssnano 中這個小插件的使用, 首先嚐試修改 node_modules/@vue/cli-service/lib/config/css.js
中的 cli 配置文件將下面一段所有註釋掉webpack
webpackConfig .plugin('optimize-css') .use(require('@intervolga/optimize-cssnano-plugin'), [{ sourceMap: options.productionSourceMap && sourceMap, cssnanoOptions: cssProcessorOptions }])
嘗試註釋掉整個 cssnano, 發現 npm run build
能夠經過, css未壓縮.
而後看能不能只取消 calc 插件的使用, 看 https://cssnano.co/ cssnano 官網, npm, github, 愣是沒找到完整的參數配置說明, 只有 https://cssnano.co/guides/pre... 中的簡單介紹和示例, 在 cli 的配置文件中嘗試設置 calc:false
也沒有用,這個方法失敗.ios
取消使用行不通只能等 cssnano 的大神再看看了,畢竟iPhone用戶那麼多,總會解決的.可是項目不等人,考慮到即使這個插件更新了也還要等 vue-cli 更新,打算先找個臨時解決方法.
考慮了一下, 官方示例是在 main.js
中引用 css文件的, 因此css 要通過優化處理. 可是 f7 官方其實提供了 framework7.min.css
這樣的文件, 徹底能夠不通過咱們的優化處理直接使用,因此嘗試直接在 index.html
中引用 css 文件.首先考慮直接把 css 文件拿出來放到 public 目錄, 可是以爲不妥, 一方面這個 css 文件放入版本管理有些沒必要要, 另外一方面每次 f7 更新都要記得本身去更新這個文件很麻煩, 因此參考官方文檔 https://cli.vuejs.org/zh/config/#chainwebpack
的語法修改 webpack 配置,用 copy 插件把文件拷貝出來
代碼以下:git
// vue.config.js const path = require('path'); module.exports = { chainWebpack: config => { config .plugin('copy-f7-css') .use(require('copy-webpack-plugin'), [[{ from: path.resolve(__dirname,'./node_modules/framework7/css/framework7.min.css'), to: path.resolve(__dirname,'./dist/css'), }]]) } }
同時把 main.js
裏的 f7 的 css 引用註釋掉.
執行 npm run build
問題解決.
只是之後咱們本身想使用 safe-area-inset-
這樣的屬性還會形成錯誤的, 因此不算正真地解決了這個問題, 不過只能先這樣解決了.github