githubhttps://github.com/cd-dongzi/vue-examplejavascript
把如下代碼進行更換css
if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader' }) } else { return ['vue-style-loader'].concat(loaders) }
更換成html
if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader', publicPath: '../../' }) } else { return ['vue-style-loader'].concat(loaders) }
在globalLessVars.js文件中 放入以下代碼前端
const fs = require('fs'); module.exports = function getLessVariables(file) { var themeContent = fs.readFileSync(file, 'utf-8') var variables = {} themeContent.split('\n').forEach(function(item) { if (item.indexOf('//') > -1 || item.indexOf('/*') > -1) { return } var _pair = item.split(':') if (_pair.length < 2) return; var key = _pair[0].replace('\r', '').replace('@', '') if (!key) return; var value = _pair[1].replace(';', '').replace('\r', '').replace(/^\s+|\s+$/g, '') variables[key] = value }) return variables }
在utils.js 引入 globalLessVars.js文件vue
const globalLessVars = require('./globalLessVars');
在 color.less 文件中 放入以下代碼java
@theme-color: #c1866a; @vice-color: rgba(186,164,119,0.99); @blue-color: #2e90fe;
在util.js文件中以下解析 color.less 文件node
const colorsLess = globalLessVars(path.join(__dirname, '../static/color.less'));
再把util.js 文件中 cssLoaders方法中返回值改爲如下代碼webpack
return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders('less', { globalVars: colorsLess }), sass: generateLoaders('sass', { indentedSyntax: true }), scss: generateLoaders('sass'), stylus: generateLoaders('stylus'), styl: generateLoaders('stylus') }
大功告成
引用多個文件的話 就這能夠這樣ios
const colorsLess = getLessVariables(path.join(__dirname, '../static/color.less')); const stylesLess = getLessVariables(path.join(__dirname, '../static/style.less')); const allLess = Object.assign(colorsLess, stylesLess); less: generateLoaders('less', { globalVars: allLess })
具體詳情能夠查看 使用webpack+vue+less開發,使用less-loader,配置全局less變量
export default new Router({ mode: 'history', routes: [ ... ] })
若是後臺沒給前端的 history 模式 匹配路徑的話, history 只適合在本地開發使用, 打包記得改回 hash 模式
import HelloWorld from '@/components/HelloWorld'
git
能夠前往 webpack.base.conf.js 中以下設置:
resolve: { extensions: ['.js', '.vue', '.json'], alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), 'components': resolve('src/components'), 'views': resolve('src/views') } }
若是出現相似以上的錯誤 , 前往 build 文件下 webpack.base.conf.js 中註釋調 eslint-loader 這個loader 就好了
若是你不想使用eslint 代碼檢測 你能夠在用vue-cli直接在建立vue項目的時候就選擇不生成代碼檢測這個eslint-loader
![]()
在 config 文件下的 index.js 文件中修改如下代碼
proxyTable: {}
設置成
proxyTable: { '/api': { target: 'http://www.mytest.com', //這裏放須要請求的接口 changeOrigin: true, pathRewrite: { '^/api': '' } } } // 請求接口的時候 http://www.mytest.com/login 能夠寫成 /api/login
能夠發起多個代理 (以下):
proxyTable: { '/api': { target: 'http://www.mytest.com', changeOrigin: true, pathRewrite: { '^/api': '' } }, '/a': { target: 'http://www.test.com', changeOrigin: true, pathRewrite: { '^/a': '' } } }
module.exports = { entry: { app: ['babel-polyfill', './src/main.js'] }, ...... }
通常在咱們請求後臺數據時,都會在請求過程當中執行動畫, 和統一管理請求錯誤,驗證TOKEN 等等的狀況;
當你使用 axios 作請求時, 你能夠作以下設置來解決以上問題
import axios from 'axios' import qs from 'qs' // 直接post請求後臺取不到參數,() // 發起請求時,會執行該方法 axios.interceptors.request.use(config => { //你能夠在這裏開始加載動畫, 查詢token 等等之類 return config }, err => { return Promise.reject(err) }) //接收到後臺的數據時執行的方法 axios.interceptors.response.use(response => response, err => Promise.resolve(err.response)) //檢查狀態碼 status function checkStatus(res) { if (res.status === 200 || res.status === 304) { //當狀態正常是返回原樣的數據 return res } return { // 狀態不正常時能夠返回本身自定義的一些格式或者狀態什麼的 .... } } //檢查後臺的code 值 function checkCode(res) { if (res.data.code === 0) { //code值錯誤時 alert('出錯了') } return res } export default { get(url, params) { //返回封裝後的 get 方法 if (!url) return return axios({ method: 'get', url, params, timeout: 10000 }).then(checkStatus).then(checkCode) }, post(url, data) { //返回封裝後的 post 方法 if (!url) return return axios({ method: 'post', url, data: qs.stringify(data), timeout: 10000 }).then(checkStatus).then(checkCode) } }
//在main.js中引入封裝後的axios import http from './utils/fetch' Vue.prototype.http = http;
post請求直接放參數, 爲什麼後臺接收不到前端的參數 axios發送post請求,springMVC接收不到數據問題
可使用Vue.$set(object, key, value)來解決這個問題
具體能夠參考這裏 變化檢測問題(數組相關)
export default new Router({ routes: [ { path: '/lazy', name: 'lazy-loading', component: (resolve) => { //這裏加載了 記得上面就不須要在import 這個組件了 require(['../components/lazy-loading'], resolve) } } ] })
先建立一個vue的 loading 結構
loading.vue
<template> <div class="loading-wrapper"> <div class="aircle"></div> </div> </template> <style lang="less" scoped> .loading-wrapper { position: fixed; width: 100%; height: 100%; left: 0; top: 0; background: rgba(0, 0, 0, .5); .aircle { width: 300px; height: 300px; position: absolute; left:0;top:0;right:0;bottom:0; margin: auto; border-radius: 50%; background: linear-gradient(#000 50%, #fff 0%); display: flex; align-items: center; animation: rotate 2s linear infinite; } .aircle:after, .aircle:before { content: ""; flex: 1; height: calc(100% / 6); border-radius: 50%; border: 50px solid #000; transform-origin: 0 50%; transform: scale(0.5); animation: change 1s ease-in-out infinite alternate; } .aircle:after { background: #000; border-color: #fff; transform-origin: 100% 50%; animation-delay: -1s; } .aircle:before { background: #fff; } @keyframes change { 100% { transform: scale(1.5); } } @keyframes rotate { 100% { transform: rotate(360deg); } } } </style>
2.在建立一個JS 文件引入這個loading.vue
index.js
import Vue from 'vue' import LoadingComponent from './loading.vue' //extend 是構造一個組件的語法器.傳入參數,返回一個組件 let LoadingConstructor = Vue.extend(LoadingComponent); let initComponent; //導出 顯示loading組件 export const showLoading = (option={}) => { initComponent = new LoadingConstructor(); initComponent.$mount(); document.querySelector(option.container || 'body').appendChild(initComponent.$el); } //導出 移除loading組件 export const hideLoading = () => { initComponent.$el.parentNode.removeChild(initComponent.$el) }
3.最後建立一個js文件統一掛載全部自定義組件到vue原型上
output.js
import Alert from './alert/index.js' //alert組件 import { showLoading, hideLoading } from './loading/index.js' //loading組件 const install = function(Vue) { //經過install方法掛載到Vue原型上去 Vue.prototype.$alert = Alert; Vue.prototype.$showLoading = showLoading; Vue.prototype.$hideLoading = hideLoading; } export default install
4.最後在main.js中引入 output.js
import globalComponents from './components/output' Vue.use(globalComponents);
在別的組件中經過以下直接調用就好了
created () { this.$showLoading() setTimeout( () => { this.$hideLoading() }, 2000); }
1.用transition元素來作動畫, 經過綁定name元素來切換不一樣的動畫
<div class="back" @click="$router.goBack()">返回</div <transition :name="transition"> <router-view class="view" /> </transition>
2.動畫樣式
.view { padding: 50px 300px; position: absolute; left: 0; top: 0; width: 100%; transition: all 0.3s linear; } .slide-left-enter, .slide-right-leave-active { opacity: 0; transform: translate(100%, 0); } .slide-left-leave-active, .slide-right-enter { opacity: 0; transform: translate(-100%, 0); }
3.給路由添加返回的狀態
import Vue from 'vue' import Router from 'vue-router' Router.prototype.back = false; Router.prototype.goBack = function () { this.back = true; this.go(-1) }
4.檢測路由的改變來切換狀態,
export default { name: "app", data() { return { transition: "slide-left" }; }, watch: { $route (to, from ) { var back = this.$router.back; if (back) { //點擊了返回 this.transition = 'slide-right' }else{ this.transition = 'slide-left' } this.$router.back = false; } } }
beforeCreate () { console.log('--------------beforeCreate-------------------') console.log('在實例建立以後同步調用。此時實例已經結束解析選項,這意味着已創建:數據綁定,計算屬性,方法,watcher/事件回') console.log('可是尚未開始 DOM 編譯,$el 還不存在,可是實例存在') }, created () { console.log('--------------created-------------------') console.log('在實例建立完成後被當即調用,掛載階段還沒開始,$el屬性目前不可見') }, beforeMount () { console.log('--------------beforeMount-------------------') console.log('模板編譯掛載以前') }, mounted () { console.log('--------------mounted-------------------') console.log('模板編譯掛載以後') }, beforeUpdate () { console.log('--------------beforeUpdate-------------------') console.log('組件更新以前') }, updated () { console.log('--------------updated-------------------') console.log('組件更新以後') }, activated () { console.log('--------------activated-------------------') console.log('keep-alive 組件激活時調用') }, deactivated () { console.log('--------------deactivated-------------------') console.log('keep-alive 組件停用時調用') }, beforeDestroy () { console.log('--------------beforeDestroy-------------------') console.log('組件銷燬以前') }, destroyed () { console.log('--------------destroyed-------------------') console.log('組件銷燬以後') }
//全局鉤子函數 const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // do something 能夠檢測用戶是否登陸啥的 next(); }); router.afterEach((to, from, next) => { console.log(to.path); }); to: 即將要進入的目標 [路由對象] from: 當前導航正要離開的路由 next(): 進行管道中的下一個鉤子。若是所有鉤子執行完了,則導航的狀態就是confirmed (確認的)。 next(false): 中斷當前的導航。若是瀏覽器的 URL 改變了(多是用戶手動或者瀏覽器後退按鈕),那麼 URL 地址會重置到 from next('/') 或者 next({ path: '/' }): 跳轉到一個不一樣的地址。當前的導航被中斷,而後進行一個新的導航 //組件內的鉤子 beforeRouteEnter (to, from, next) { // 在渲染該組件的對應路由被 confirm 前調用 // 相對於組件來講的,並且應該是在路由進入以前開始準備的 因此beforeRouteEnter是調用ajax的時機 // 不能獲取組件實例 `this` // 由於當鉤子執行前,組件實例還沒被建立 next(); }, beforeRouteLeave (to, from, next) { //在組件的生命週期完成後,且舊路由即將切換走,新路由beforeEach的時機執行 }
assetsPublicPath: '/'
更改爲
assetsPublicPath: './'
在構建生產環境版本時是否開啓source map
productionSourceMap: true
當把這個設置 置爲 false 時, 文件體積會變得很小 JavaScript Source Map 詳解
.babelrc { // 此項指明,轉碼的規則 "presets": [ // env項是藉助插件babel-preset-env,下面這個配置說的是babel對es6,es7,es8進行轉碼,而且設置amd,commonjs這樣的模塊化文件,不進行轉碼 ["env", { "modules": false, "targets": { "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] } }], // 下面這個是不一樣階段出現的es語法,包含不一樣的轉碼插件 "stage-2" ], // 下面這個選項是引用插件來處理代碼的轉換,transform-runtime用來處理全局函數和優化babel編譯 "plugins": ["transform-runtime"], // 下面這段是在特定的環境中所執行的轉碼規則,當環境變量是下面的test就會覆蓋上面的設置 "env": { // test 是提早設置的環境變量,若是沒有設置BABEL_ENV則使用NODE_ENV,若是都沒有設置默認就是development "test": { "presets": ["env", "stage-2"], // instanbul是一個用來測試轉碼後代碼的工具 "plugins": ["istanbul"] } } }
.editorconfig charset = utf-8 //編碼 indent_style = space //縮進風格,基於空格作縮進 indent_size = 2 //縮進大小是2格 end_of_line = lf //換行符的風格 insert_final_newline = true //當你建立一個文件,會自動在文件末尾插入新行 trim_trailing_whitespace = true //自動移除行尾多餘空格
package.json "name": "example", "version": "1.0.0", "description": "A Vue.js project", "author": "", "private": true, "scripts": { // 例: "dev": "node build/dev-server.js" // "dev"就至關於須要在命令行執行 npm run dev 全部咱們執行的npm run dev 至關於執行了 "node build/dev-server.js" // 基本全部腳本命令 都須要 加上前綴 npm run ... ,可是 "start" 這個腳本命令只須要執行 npm start 就行, 不須要中間的 run; "dev": "node build/dev-server.js", "start": "npm run dev", "build": "node build/build.js" }, "dependencies": { // 生產環境所須要的依賴 "vue": "^2.5.2", "vue-router": "^3.0.1" ...... }, "devDependencies": { // 開發環境所須要的依賴 "autoprefixer": "^7.1.2", "babel-core": "^6.22.1", ....... }, "engines": { "node": ">= 4.0.0", "npm": ">= 3.0.0" }, "browserslist": [ "> 1%", "last 2 versions", "not ie <= 8" ] }
更多的文件配置能夠參考 vue-cli#2.0 webpack 配置分析
但願能跟你們一塊兒進步, O(∩_∩)O謝謝
github地址