本章內容包含上一章思考的解決,還有一些其它的定製...css
關於對.vue
文件模塊處理規則的配置依次可在build/webpack.base.conf.js
->build/vue-loader.conf.js
->build/utils.js
文件中跟蹤;html
而loaders
的關鍵在於build/vue-loader.conf.js
文件中對utils.cssLoaders
的調用:vue
... module.exports = { loaders: utils.cssLoaders({ sourceMap: sourceMapEnabled, extract: isProduction }), ...
說了這麼一堆,我想表達啥呢?node
由於我的在項目中,習慣用scss
編寫樣式,跟蹤以上文件發現,針對.vue
文件的預處理loaders
中已經包含對scss
的處理:webpack
//utils.js文件 exports.cssLoaders = function (options) { options = options || {} ... return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders('less'), sass: generateLoaders('sass', { indentedSyntax: true }), scss: generateLoaders('sass'), stylus: generateLoaders('stylus'), styl: generateLoaders('stylus') } }
這樣,是否是能夠直接使用scss
了呢?web
恭喜你,會報錯...npm
查找發現,package.json
中並無關於sass-loader
的依賴,因此,咱們須要安裝sass-loader
、node-sass
NPM包:npm i -D sass-loader
、npm i -D node-sass
。json
安裝完成後,在src/components/HelloWorld.vue
文件中進行測試:瀏覽器
默認狀況下,初始化的環境是不容許局域網訪問的,若是想局域網訪問的話,跟蹤路徑build/webpack.dev.conf.js
(爲何跟蹤這個文件呢?)能夠發現:sass
devServer: { clientLogLevel: 'warning', ... host: HOST || config.dev.host, port: PORT || config.dev.port, open: config.dev.autoOpenBrowser, ...
這裏指定了host
字段,而HOST
值在該文件可查找到const HOST = process.env.HOST
,也就是說,若是想要局域網內訪問,有兩種解決方案:
--host 0.0.0.0
,即在/package.json
的scripts
中修改 "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --host 0.0.0.0",
;config/index.js
中:module.exports = { dev: { ... host: 'localhost', // can be overwritten by process.env.HOST port: 8080, ...
修改host: 'localhost',
爲host: '0.0.0.0',
,便可;
推薦使用配置文件修改,即:第二種。
至於,爲何跟蹤build/webpack.dev.conf.js
文件?
由於這個功能是開發環境下獨有的,要修改開發環境吖,必然找開發環境的配置文件進行跟蹤。
注意:
Ctrl + c
,而後npm run dev
便可)纔可應用新的配置。重啓項目後,在瀏覽器中輸入http://192.168.1.106:8080/#/
(192.168.1.106
是你本地IP,可經過ipconfig /all
查看)可以訪問,就說明局域網內的其餘端能夠訪問。
不信?你試試手機。
若是,你想和其它朋友分享你的成果,部署到服務器上或直接打包發給朋友,經過npm run build
便可生成靜態資源dist/
。
然而,打開dist/index.html
,發現是空白頁,控制檯還報錯(資源找不到),人生失去了但願...
這是由於webpack
生產配置文件output.publicPath
配置有問題,跟蹤文件build/webpack.base.conf.js
->build/webpack.prod.conf.js
。
很好,咱們在build/webpack.base.conf.js
中就發現了:
output: { path: config.build.assetsRoot, filename: '[name].js', publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath },
跟蹤config.build.assetsPublicPath
找到config/index.js
,修改:
build: { // Template for index.html index: path.resolve(__dirname, '../dist/index.html'), // Paths assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublicPath: '/', //將assetsPublicPath的值修改成'./'
爲何這樣修改呢?
這是由於打包文件引用所在地址的組成規則爲output.publicPath + filename
。
然而,這樣並無結束。
若是在樣式中引入圖片,會報圖片路徑錯誤,引用地址static/css/static/css/img/XXX.png
;
須要修改build/utils.js
:
if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader', publicPath: '../../' }) } else { return ['vue-style-loader'].concat(loaders) }
webpack
打包要區分兩個路徑:
目前還不能結束...
目前ES6
的語法成爲了主流,若是你在項目中使用了ES6
,在一些較舊的瀏覽器中,呵呵...
像Object.assign
、Array.from
...方法沒法使用,程序報錯。
怎麼辦呢?
npm i -S babel-polyfill
安裝polyfill
,它會爲ES2015+添加的新的API做兼容爲低版本瀏覽器可用,俗稱「墊片」。
須要將polyfill
打包到生產包中,即build/webpack.base.conf.js
文件中:
module.exports = { context: path.resolve(__dirname, '../'), entry: { app: './src/main.js' //須要修改成app: ['babel-polyfill','./src/main.js'] },