[TOC]
>[success] # webPack -- 自定義Vue操作
~~~
1.首先需要理解webpack--自定義配置章節中的
1.1'node 的包查找規則'
1.2'Runtime Only和Runtime+Compiler',
1.3'為什么使用的是render',
1.4'es6 導出和node導出'
2.一定不要迷糊在webpack中,main.js或者是js的文件入口不管他叫什么,為什么
在哪里寫的原因是,在打包的時候配置了要被打包的文件,這個如果就是被打包的
文件,所以所有東西最后到在這導入。
3.index.html 甚至其他名字的總html,為什么叫html入口,也是因為配置,文件最
后配置的html會在這集成。
~~~
>[info] ## 開始配置
~~~
.
├── dist // 打包后的文件
├── src // 源碼文件
| ├── css
| └── js
| └── components // 存放組件的文件夾
| └── index.html // 這是打包后顯示的html總文件
| └── App.vue //所有組件路由在這在App.vue
| └── main.js // 這是 main.js 是我們項目的JS入口文件
├── package.json // npm init 生成的NPM包的所有相關信息,其中sprict可以腳本
├── .babelrc //將高級語法轉換成低級語法
└── webpack.config.js // 配置webpack的配置文件
~~~
>[danger] ##### 說明
~~~
1.根據'前端知識擴展' -- webpack 配置篇完成基礎配置后,在根據vue配置進行單獨
配置。
~~~
>[danger] ##### 開始
~~~
1.安裝vue : npm i vue -S
2.我們寫的vue組件都會以.vue形式結尾,已經在'前端擴展'中提到,webpack是基
于node,也就是說node 只認識'.js''.node''.json' 結尾的文件想使用就給配置:
npm i vue-loader vue-template-compiler -D // 這里安裝了兩個包因為vue-loader 依賴vue-template-compiler 所以安裝兩個
3.在webpack.config.js 的module節點下rules數組配置是哪個vue的編譯規則
{ test: /\.vue$/, use: 'vue-loader' } // 處理 .vue 文件的 loader
~~~
>[danger] ##### 對于使用import 導入vue注意點:
~~~
import Vue from 'vue'
1.根據上面的查找規則在vue在main屬性中的入口文件不是功能完整的文件,
導入的 Vue 構造函數,功能不完整,只提供了 runtime-only 的方式,并沒有
提供 像網頁中那樣的使用方式
2..因此解決方法有三種:
4.1 改變main 參數的入口文件地址改成vue.js
4.2 導入使用地址方式的引入,明確具體文件import Vue from '../node_modules/vue/dist/vue.js'
4.3在webpack.config.js 文件中配置節點點引入
resolve: {
alias: { // 修改 Vue 被導入時候的包的路徑
"vue$": "vue/dist/vue.js"
}
}
3.但是正常情況下我們是不會去改變的而是使用render 去渲染,不會做上面三種
特別的配置
~~~
* 使用render 渲染如下
~~~
import Vue from 'vue'
// 導入的組組件
import login from './login.vue'
var vm = new Vue({
el:"#app",
data:{
msg:"123"
},
// 在 webpack 中,如果想要通過 vue, 把一個組件放到頁面中去展示,vm 實例中的 render 函數可以實現
// 用render 渲染的組建
/* render: function (createElements) {
return createElements(login)
} */
// 縮寫
render: c => c(login)
})
~~~
>[danger] ##### 在vue中.vue 結尾的組件格式如何書寫
~~~
1.組件vue-loader會把這三部分整合在一起
2.使用export default把組件對象暴露出去
~~~
~~~
<template>
<div>
<h1>這是登錄組件,使用 .vue 文件定義出來的 --- {{msg}}</h1>
</div>
</template>
<script>
export default {
data() {
// 注意:組件中的 data 必須是 function
return {
msg: "123"
};
},
methods: {
show() {
console.log("調用了 login.vue 中的 show 方法");
}
}
};
</script>
<style>
</style>
~~~
>[danger] ##### 為什么頁面中有個app.vue的文件
~~~
1.首先如果沒有app.vue文件,我們在main.js 也就打包文件中引入Vue實例對象,
也在我們將要渲染的頁面index.html 加上了綁定的el,但是render渲染的頁面,只
會render的數據,其他數據都會被覆蓋,例如:
<div id="app">
<!--雖然現在寫我了 但是實際加載沒有我-->
<a></a>
<!--我是render 渲染的組件 頁面只能有我在-->
<login></login>
</div>
2.因此創建了一個app.vue 文件在目錄下,這樣在main.js 渲染的是我們的app.vue
組件,我們在app.vue 這個組件中綁定路由,這樣在index.html中只要渲染
app.vue組件,砸死app.vue 整合其他組件:
3.剛才說了這么多讓我們重新看一下,按照新 思路寫的mian.js 中的vue實例
import app from './App.vue'
var vm = new Vue({
el: '#app',
render: c => c(app),
router // 4. 將路由對象掛載到 vm 上
})
4.看一下在app.vue寫的內容:
<template>
<div>
<h1>app.vue</h1>
<router-link to="/account" tag="span">登錄</router-link>
<router-link to="/goodslist">注冊</router-link>
<router-view></router-view>
</div>
</template>
<script>
</script>
<style lang="scss" scoped>
</style>
5.在index.html綁定的vue,dom中寫的內容
<div id="app">
<app></app>
</div>
~~~
>[danger] ##### 配置路由
~~~
1.npm install vue-router
2.// 1. 導入 vue-router 包
import VueRouter from 'vue-router'
// 2. 手動安裝 VueRouter
Vue.use(VueRouter)
3.記得在vue實例去綁定這個路由
~~~
>[danger] ##### 向后臺項目一樣吧路由抽離
~~~
1.在main.js 帶編譯js 中創建vue實例對象,使用render 渲染總的組件
2.路由負責 處理個個組件,單個組件可以依靠路由委托在總組件中
~~~
~~~
import VueRouter from 'vue-router'
// 導入 Account 組件
import account from './main/Account.vue'
import goodslist from './main/GoodsList.vue'
// 導入Account的兩個子組件
import login from './subcom/login.vue'
import register from './subcom/register.vue'
// 3. 創建路由對象
var router = new VueRouter({
routes: [
// account goodslist
{
path: '/account',
component: account,
children: [
{ path: 'login', component: login },
{ path: 'register', component: register }
]
},
{ path: '/goodslist', component: goodslist }
]
})
// 把路由對象暴露出去
export default router
~~~
>[success] # 這里還是要強調下
~~~
1.在整個項目src目錄中的js和html 都是我們配置webpack打包的目標文件,也就
是我們所說的入口文件,正因如此我們將一些引入包最后都匯集在這里
2.render 會把 el 指定的容器中,所有的內容都清空覆蓋,所以不要把路由的
router-view 和 router-link 直接寫到 el 所控制的元素中
3.組件, 是通過 路由匹配監聽到的,所以組件,只能展示到 屬于 路由的
<router-view></router-view> 中去;
~~~
- Vue--基礎篇章
- Vue -- 介紹
- Vue -- MVVM
- Vue -- 創建Vue實例
- Vue -- 模板語法
- Vue -- 指令用法
- v-cloak -- 遮蓋
- v-bind -- 標簽屬性動態綁定
- v-on -- 綁定事件
- v-model -- 雙向數據綁定
- v-for -- 只是循環沒那么簡單
- 小知識點 -- 計劃內屬性
- key -- 屬性為什么要加
- 案例說明
- v-if/v-show -- 顯示隱藏
- v-for 和 v-if 同時使用
- v-pre -- 不渲染大大胡語法
- v-once -- 只渲染一次
- Vue -- class和style綁定
- Vue -- filter 過濾器
- Vue--watch/computed/fun
- watch -- 巧妙利用watch思想
- Vue -- 自定義指令
- Vue -- $方法
- Vue--生命周期
- Vue -- 專屬ajax
- Vue -- transition過渡動畫
- 前面章節的案例
- 案例 -- 跑馬燈效果
- 案例 -- 選項卡內容切換
- 案例-- 篩選商品
- 案例 -- 搜索/刪除/更改
- 案例 -- 用computed做多選
- 案例 -- checked 多選
- Vue--組件篇章
- component -- 介紹
- component -- 使用全局組件
- component -- 使用局部組件
- component -- 組件深入
- component -- 組件傳值父傳子
- component -- 組件傳值子傳父
- component -- 子傳父語法糖拆解
- component -- 父組件操作子組件
- component -- is 動態切換組件
- component -- 用v-if/v-show控制子組件
- component -- 組件切換的動畫效果
- component -- slot 插槽
- component -- 插槽2.6
- component -- 組件的生命周期
- component -- 基礎組件全局注冊
- VueRouter--獲取路由參數
- VueRouter -- 介紹路由
- VueRouter -- 安裝
- VueRouter -- 使用
- VueRouter--router-link簡單參數
- VueRouter--router-link樣式問題
- VueRouter--router-view動畫效果
- VueRouter -- 匹配優先級
- vueRouter -- 動態路由
- VueRouter -- 命名路由
- VueRouter -- 命名視圖
- VueRouter--$router 獲取函數
- VueRouter--$route獲取參數
- VueRouter--路由嵌套
- VueRouter -- 導航守衛
- VueRouter -- 寫在最后
- Vue--模塊化方式結構
- webpack--自定義配置
- webpack -- 自定義Vue操作
- VueCli -- 3.0可視化配置
- VueCli -- 3.0 項目目錄
- Vue -- 組件升級篇
- Vue -- 組件種類與組件組成
- Vue -- 組件prop、event、slot 技巧
- Vue -- 組件通信(一)
- Vue -- 組件通信(二)
- Vue -- 組件通信(三)
- Vue -- 組件通信(四)
- Vue -- 組件通信(五)
- Vue -- 組件通信(六)
- Vue -- bus非父子組件通信
- Vue -- 封裝js插件成vue組件
- vue組件分裝 -- 進階篇
- Vue -- 組件封裝splitpane(分割面板)
- UI -- 正式封裝
- Vue -- iview 可編輯表格案例
- Ui -- iview 可以同時編輯多行
- Vue -- 了解遞歸組件
- UI -- 正式使用遞歸菜單
- Vue -- iview Tree組件
- Vue -- 利用通信仿寫一個form驗證
- Vue -- 使用自己的Form
- Vue -- Checkbox 組件
- Vue -- CheckboxGroup.vue
- Vue -- Alert 組件
- Vue -- 手動掛載組件
- Vue -- Alert開始封裝
- Vue -- 動態表單組件
- Vue -- Vuex組件的狀態管理
- Vuex -- 參數使用理解
- Vuex -- state擴展
- Vuex -- getters擴展
- Vuex--mutations擴展
- Vuex -- Action 異步
- Vuex -- plugins插件
- Vuex -- v-model寫法
- Vuex -- 更多
- VueCli -- 技巧總結篇
- CLI -- 路由基礎
- CLI -- 路由升級篇
- CLI --異步axios
- axios -- 封裝axios
- CLI -- 登錄寫法
- CLI -- 權限
- CLI -- 簡單權限
- CLI -- 動態路由加載
- CLI -- 數據性能優化
- ES6 -- 類的概念
- ES6類 -- 基礎
- ES6 -- 繼承
- ES6 -- 工作實戰用類數據管理
- JS -- 適配器模式
- ES7 -- 裝飾器(Decorator)
- 裝飾器 -- 裝飾器修飾類
- 裝飾器--修飾類方法(知識擴展)
- 裝飾器 -- 裝飾器修飾類中的方法
- 裝飾器 -- 執行順序
- Reflect -- es6 自帶版本
- Reflect -- reflect-metadata 版本
- 實戰 -- 驗證篇章(基礎)
- 驗證篇章 -- 搭建和目錄
- 驗證篇章 -- 創建基本模板
- 驗證篇章 -- 使用
- 實戰 -- 更新模型(為了迎合ui升級)
- 實戰 -- 模型與接口對接
- TypeSprict -- 基礎篇章
- TS-- 搭建(一)webpack版本
- TS -- 搭建(二)直接使用
- TS -- 基礎類型
- TS -- 枚舉類型
- TS -- Symbol
- TS -- interface 接口
- TS -- 函數
- TS -- 泛型
- TS -- 類
- TS -- 類型推論和兼容
- TS -- 高級類型(一)
- TS -- 高級類型(二)
- TS -- 關于模塊解析
- TS -- 聲明合并
- TS -- 混入
- Vue -- TS項目模擬
- TS -- vue和以前代碼對比
- TS -- vue簡單案例上手
- Vue -- 簡單弄懂VueRouter過程
- VueRouter -- 實現簡單Router
- Vue-- 原理2.x源碼簡單理解
- 了解 -- 簡單的響應式工作原理
- 準備工作 -- 了解發布訂閱和觀察者模式
- 了解 -- 響應式工作原理(一)
- 了解 -- 響應式工作原理(二)
- 手寫 -- 簡單的vue數據響應(一)
- 手寫 -- 簡單的vue數據響應(二)
- 模板引擎可以做的
- 了解 -- 虛擬DOM
- 虛擬dom -- 使用Snabbdom
- 閱讀 -- Snabbdom
- 分析snabbdom源碼 -- h函數
- 分析snabbdom -- init 方法
- init 方法 -- patch方法分析(一)
- init 方法 -- patch方法分析(二)
- init方法 -- patch方法分析(三)
- 手寫 -- 簡單的虛擬dom渲染
- 函數表達解析 - h 和 create-element
- dom操作 -- patch.js
- Vue -- 完成一個minVue
- minVue -- 打包入口
- Vue -- new實例做了什么
- Vue -- $mount 模板編譯階段
- 模板編譯 -- 分析入口
- 模板編譯 -- 分析模板轉譯
- Vue -- mountComponent 掛載階段
- 掛載階段 -- vm._render()
- 掛載階段 -- vnode
- 備份章節
- Vue -- Nuxt.js
- Vue3 -- 學習
- Vue3.x --基本功能快速預覽
- Vue3.x -- createApp
- Vue3.x -- 生命周期
- Vue3.x -- 組件
- vue3.x -- 異步組件???
- vue3.x -- Teleport???
- vue3.x -- 動畫章節 ??
- vue3.x -- 自定義指令 ???
- 深入響應性原理 ???
- vue3.x -- Option API VS Composition API
- Vue3.x -- 使用set up
- Vue3.x -- 響應性API
- 其他 Api 使用
- 計算屬性和監聽屬性
- 生命周期
- 小的案例(一)
- 小的案例(二)-- 泛型
- Vue2.x => Vue3.x 導讀
- v-for 中的 Ref 數組 -- 非兼容
- 異步組件
- attribute 強制行為 -- 非兼容
- $attrs 包括 class & style -- 非兼容
- $children -- 移除
- 自定義指令 -- 非兼容
- 自定義元素交互 -- 非兼容
- Data選項 -- 非兼容
- emits Option -- 新增
- 事件 API -- 非兼容
- 過濾器 -- 移除
- 片段 -- 新增
- 函數式組件 -- 非兼容
- 全局 API -- 非兼容
- 全局 API Treeshaking -- 非兼容
- 內聯模板 Attribute -- 非兼容
- key attribute -- 非兼容
- 按鍵修飾符 -- 非兼容
- 移除 $listeners 和 v-on.native -- 非兼容
- 在 prop 的默認函數中訪問 this -- ??
- 組件使用 v-model -- 非兼容
- 渲染函數 API -- ??
- Slot 統一 ??
- 過渡的 class 名更改 ???
- Transition Group 根元素 -- ??
- v-if 與 v-for 的優先級對比 -- 非兼容
- v-bind 合并行為 非兼容
- 監聽數組 -- 非兼容