目录
3.自己把vue.js文件放在项目文件夹中引入项目 然后webpack打包
1. 自己构建vue的脚手架(面试): 用npm下载vue 引入到项目中 然后webpack打包
3.考点:如何解决vue第一次加载的时候 页面上使用的数据会闪烁?(面试)
vue就是个很多js工具代码的js文件
因此可以直接引入到html文件中:两类方式
就是直接把vue的js代码库运行到html环境中
1.下载到本地,然后引入
<div id="app">{{msg}}div> <script> new Vue({ el: "#app", data: { msg: "hello" } }) script>
2.自己引入CDN
<div id="app">{{msg}}div> <script> new Vue({ el: "#app", data: { msg: "hello" } }) script>
3.自己把vue.js文件放在项目文件夹中引入项目 然后webpack打包
index.html
<div class="box"> {{msg}} div>main.js
import Vue from "./vue2.6.14.js" new Vue({ el:".box", data:{msg:"hqyj6666"} })webpack.config.js
const MiniCssExtractPlugin = require("mini-css-extract-plugin") const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: __dirname + "/src/main.js", //默认是__dirname+"/src/index.js" output: { asyncChunks: true, //创建按需加载的异步 chunk。 path: __dirname + "/dist", //输出的目录,绝对路径,默认dist filename: '[name]-hqyj2-[id]bundle[hash:6].js', //输出的文件名,[hash:5]为5位哈希值,[id]为打包的chunk的id,[name]为入口的属性名,缺省则为mian,这几个一定记住 vue和react的css作用域-就是这个几个设计的 library: { name: 'MyLibrary', //库名 type: 'assign', //配置将库暴露的方式。('var'、'module'、'assign'、'assign-properties'、'this'、'window'、'self'、'global'、'commonjs'、'commonjs2'、'commonjs-module'、'commonjs-static'、'amd'、'amd-require'、'umd'、'umd2'、'jsonp' 以及 'system') }, auxiliaryComment: { root: 'Root Comment', commonjs: 'CommonJS Comment', commonjs2: 'CommonJS2 Comment', amd: 'AMD Comment', }, clean: true, // 在生成文件之前清空 output 目录 }, module: { rules: [ { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"] }, { test: /\.(png|jpg|jpeg|mp4|mp3)$/, use: ["file-loader"] }, { test: /\.ts$/, use: "ts-loader" }, { test: /\.js$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], plugins: ['@babel/plugin-proposal-object-rest-spread'] } } }, { test: /\.s[a,c]ss$/, use: ["style-loader", "css-loader", "sass-loader"] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: 'index.css' //css生成到css文件中,项目中手动以形式引入使用 }), new HtmlWebpackPlugin({ title: "hqyj-app", //html的标题默认为"Webpack App", filename: "index.html", //模板html打包后生成的文件名,放在output.path里面,默认"index.html" template: __dirname + "/public/index.html", //模板html文件的路径, inject: "body", //'head' || 'body' 打包后的bundle挂载到模板html的位置:'body' 放置在body元素的底部。'head'将把脚本放在head元素中。, publicPath: "./", //The publicPath used for script and link tags, minify: { collapseWhitespace: false, //是否压缩HTML:空格回车 keepClosingSlash: true,//在单元素上保留末尾的斜杠 removeComments: false, //是否清除HTML注释 removeRedundantAttributes: true, removeScriptTypeAttributes: true, //是否删除script的type属性(这个属性对于现代浏览器没啥用) removeStyleLinkTypeAttributes: true, //是否删除< style>和< link>的type="text/css" minifyJS: false, //是否压缩页内JS , minifyCSS: true //是否压缩页内CSS }, cache: true,//仅当文件被更改时才重新打包,否则使用上一次打包时缓存起来的,默认true }) ], mode: "none", devServer: { open: true, //cli中 webpack serve --open port: 8080, hot: true, host: '192.168.1.10', compress: true, proxy: { '/api': 'http://localhost:7001', }, } }
4.编辑器直接生成cdn的方式
HbuilderX 创建项目 选择 vue项目普通模式
点击创建后,会自动生成几个文件 css、img、js、index.html
index.html: (默认会写上以下代码)
<div id="app"> {{ counter }} div> <script> const App = { data() { return { counter: 100 } } }; Vue.createApp(App).mount('#app'); script>
就是直接把vue的代码环境集成了 然后开始在vue的代码环境中写项目,最终才经过webpack打包生成第一类方式
1.新建项目 alipay
2.初始化配置文件:npm init -y
3.下载依赖:
npm i webpack@5.74.0 webpack-cli@4.10.0 vue-loader@17.0.0 @vue/compiler-sfc@3.2.37 webpack-dev-server@4.10.0 html-webpack-plugin@5.5.0 -D
npm i vue -S
- //4.webpack.config.js配置:
- const path = require('path');
- const {
- VueLoaderPlugin
- } = require('vue-loader');
- const HtmlWebpackPlugin = require('html-webpack-plugin');
- module.exports = {
- mode: 'production',
- watch: true,
- entry: './src/main.js',
- output: {
- filename: '[name].js',
- path: path.resolve(__dirname, 'dist'),
- },
- module: {
- rules: [{
- test: /\.vue$/,
- loader: 'vue-loader',
- }, ]
- },
- plugins: [
- new HtmlWebpackPlugin({
- template: path.join(__dirname, 'public/index.html'),
- filename: 'index.html',
- inject:"body"
- }),
- new VueLoaderPlugin(),
- ],
- devServer: {
- open: true,
- port: 8080,
- hot: true,
- host: '192.168.2.60', //改为自己的ip
- compress: true,
- },
- }
-
- //5.项目配置文件 pakage.json文件中:
- //scripts:{
- //"dev": "webpack serve --config webpack.config.js"
- //}
-
- //6.main.js文件:
- import { createApp } from 'vue'
- import App from './App.vue'
- import {createApp} from 'vue'
- createApp(App).mount('#app')
- document.body.innerHTML+="444"
-
- //7.模板html文件中
- <div id="app">div>
-
- //8. box.vue 文件中:
- <template>
- <div>
- {{msg}}
- div>
- template>
- <script>
- export default {
- data(){
- return {msg:"hello vue 文件 写出来的页面"}
- }
- }
- script>
- <style>
- style>
-
注意:webpack.config.js里面的 plugins下的inject:“body” ,不要写head,不然会发生div都还没定义
然后就可以启动了:npm run dev 或者npm run serve ( "serve": "webpack server --config webpack.config.js"看自己怎么定义的)
但是 修改了之后 会等很久才刷新 因为没有配置优化 所以很卡 官方的脚手架配置的特别好 就反应很快
1. npm install @vue/cli -g //下载官方脚手架 到全局,集成webpack的环境,能生成webpack的这个软件就是脚手架 (cli一般指的是自动化)
(vue -V ==>查看脚手架的版本)
2. vue create app1 //项目名称
3. 接下来让你选择一些默认要生成的工具,不管直接回车会选择插件,比如:([Vue 2]babel、eslint) 、 ([Vue 3]babel、eslint)
以及选择一些配置
4. 进入项目文件夹: cd app1 //进入项目文件夹,也可以直接在项目文件夹中打开终端
5. 启动:
npm run serve //生成的打包文件在内存中不会写入磁盘用于开发阶段
或者
npm run build //生成的打包文件在dist中 用于项目上线注意:不要有中文路径
1. cnpm install @vue/cli -g
2. vue ui
3. 打开的界面 中
4.创建项目==>填写项目名字,选择项目创建的目录 点击创建
5.等待它下载所有配置文件完毕
6.任务中serve启动以后想当与启动了热更新服务器:默认localhost:8080(也可以点启动app直接帮我们打开localhost:8080)
7.如果把项目做完以后要上线,就启用build相当于webpack的打包,生成dist文件,注意:打包的路径是相对路径要改一下配置中的公共路径为: ./ 然后点保存修改index.html
html> <html lang=""> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <link rel="icon" href="<%= BASE_URL %>favicon.ico"> <title><%= htmlWebpackPlugin.options.title %>title> head> <body> <noscript> <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.strong> noscript> <div id="app">div> body> html>App.vue
<div id="app"> <img alt="Vue logo" src="./assets/logo.png"> <HelloWorld msg="Welcome to Your Vue.js App"/> div> template> <script> import HelloWorld from './components/HelloWorld.vue' export default { name: 'App', components: { HelloWorld } } script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } style>main.js
import Vue from 'vue' import App from './App.vue' new Vue({ render: h => h(App), }).$mount('#app')
HbuilderX 创建项目 选择 vue项目 vue-cli默认模板,点击创建后就会下载
然后要:npm i
再:npm run serve
TIPS:
在pachage.json中有的有符号~ ^ 有的没有符号
^:代表以后下载就是下载最新版本
~:下载当前最新版
没有符号:代表固定版本
//npm i "^7.12.16", 就会下载7中最新版 就算已经升级到了12.1.1
//npm i "~7.12.16", 下载最新版
在标签尖括号中使用{{}}插入js表达式:变量,函数调用,三目运算等等,插值表达式中的标识符 代表vue对象中的data的属性名或者methods中的方法名
{{}} 是一种插值表达式 会作为js语法执行环境
- "app">
- <h1>标题:{{title}}h1>
- <h2>性别:{{msg}}h2>
- <h3>姓名:{{obj.name}}h3>
- <h3>年龄:{{obj.age}}岁h3>
- <h4>爱好1:{{arr[0]}}h4>
- <h4>爱好2:{{arr[1]}}h4>
- <h5>体重:{{fn()}}h5>
- <h5>体重:{{fn()+20}}h5>
- <p>{{a}}p>
-
- <script>
- var a="hello 测试"// window.a
- let data={
- title:"个人信息",
- msg:"女",
- obj:{age:24,name:"karen"},
- arr:["唱歌","跳舞"],
- fn:()=>90
- }
- let option={
- el:"#app",
- data
- }
- var vm=new Vue(option)
- console.log(vm,data,vm==data) //false
- script>
v-html ==>相当于innerHTML
v-text==>相当于innerText
v-pre==>插件表达式就被识别为文本,而不是js表达式 (就是想把msg显示出来)静默-跳过编译
v-cloak==>加上这个属性的标签相当于在构建虚拟节点的时候就会有这个属性,等data的数据生成的时候,这个标签会自动去掉这个属性,可以利用这个特性来在css中把这个元素在加载初期写样式(隐藏)
- //示例:
{{msg+"666"}}
- <p v-cloak>{{fn()}}p>
- <p v-cloak>{{ count==10?"hellohqyj":"hqyjhello" }}p>
-
- <div v-html="p_html">div>
- <div v-text="p_text">div>
- <p v-pre>{{p_pre}}p>
-
- [v-clock] {
- display: none;
- }
-
- <div id="app" v-clock>
- <div>{{msg1}}div>
-
- <div>{{msg2}}div>
- <div id="" class="" v-text="msg3">div>
- <div v-html="msg4">div>
- <div v-pre>{{msg1}}div>
- div>
- <script type="text/javascript">
- var vm = new Vue({
- el: "#app",
- data: {
- msg1: "hello",
- msg2: "hello2",
- msg3: "hello3", //这个会把标签显示出来
- msg4: "hello4" //这个不会把标签显示出来
- }
- })
- script>
关于页面加载会先闪烁,然后再显示内容,的解决办法有三个:
1、添加一个属性 v-clock 在vue框架运行时 会把项目中的v-clock属性去掉
2、不用el关联,使用$mount
3、尽量使用指令
3.1.界面加载的时候会把节点直接挂载到文档树中,导致{{msg+"666"}}这个字符串会显示一下
3.2.vue对象生成data数据时候 回去刷新界面 把{{msg+"666"}}字符串替换成结果字符串
3.3.导致界面第一次加载的时候会闪屏
3.4.解决方案:使用v-html,v-text指令操作,或者css中加[v-cloak] {display:none};
所有标签中属性绑定js中变量:
标准写法: v-bind:src="变量"
简写形式: :src="[10,20,30]"==> 语法糖
1、obj["age"] ==> obj.age
2、v-bind: ==> :
- 示例:
- <a v-bind:href="link">baidua>
- <a :href="link">baidua>
- <div id='app'>
- <div>{{obj.age}}div>
- <div v-text="obj.name">div>
- <div v-html="obj.gender">div>
- <img v-bind:src="obj.touxiang">
- <a v-bind:href="sina[0].source">{{sina[0].site}}a>
- <a v-bind:href="sina[0].source" v-html="sina[0].site">a>
- <input type="text" v-bind:value="emial">
- <div v-bind:class="box">213123div>
- <input type="text" :value="emial">
- div>
- <script>
- var vm = new Vue({
- el: '#app',
- data: {
- box: "div1",
- obj: {
- age: 24,
- name: "karen",
- gender: "singer",
- touxiang: "https://img1.baidu.com/it/u=1223669517,3326619488&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1661878800&t=9b6c9d1a92779c08c8e927081ba3ecdd"
- },
- sina: [{
- source: "http://www.baidu.com",
- site: "百度"
- }],
- emial: "123545@qq.com" //数据驱动页面的思想
- }
- })
- script>
后面没有表达式
只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点被视为静态内容并跳过,这可以用于优化更新性能
每一个要说出功能
1、v-bind:属性名=“js语法环境”
语法糖: :属性名
2、v-if 的底层是销毁,不挂在 (高渲染)
3、v-show 不论怎么样都会挂载,只是display为none (高切换)
4、v-on:事件名(可以是自定义事件)=“监听器”
语法糖:@事件名.事件修饰符
事件修饰符:stop capture self once (可以连调)
5、v-model=“msg” 组件也可以使用,组件内部要触发input书简,属性接受的属性名是value
v-model.trim="msg" v-model.number="msg" v-model.lazy="msg"
他也是一个语法糖 默认是 :value和 @input 的语法糖
6、v-cloak 解决首屏闪烁bug,但是面试常问首屏问题并不是
7、v-if
8、v-if/v-else
9、v-if/v-else/v-else
10、v-for ==>:key="index" / "id"
key可以绑数组的下标,但是不太好,原因==>数组下标和数组中的数据会错位
11、v-for和v-if不要放在一起了,2.0 for优先,3.0 if优先, 但是都不太好
12、v-pre 静默,跳过编译, 如果有{{}}等就会跳过,不会去编译
13、v-slot :插槽 不同的版本用法不一样,组件内部用slot标签代表槽位,name属性是具名槽位,使用组件时,具名必须用template来插入数据 v-slot :槽位名
语法糖 #槽位名
14、v-once 只渲染元素和组件一次。