Vue-next 探究

前言

由于最近公司项目甚多,现在终于有点时间了,所以去看了一下vue-next(下一代vue.js 3.0),相信不久的将来vue3.0很快就要发布出来了。
这次是用TypeScript重构的,里面也新增了很多特性,如CompositionAPI,修改了数据响应式的实现方式等等,好的一点就是它是完全兼容2x的写法,而且在性能和速度上有显著的提升。


相关链接

vite:https://github.com/vitejs/vite

vue-next:https://github.com/vuejs/vue-next

vue-next-webpack:https://github.com/vuejs/vue-next-webpack-preview

vue Composition API:https://vue-composition-api-rfc.netlify.app/api.html


调试环境搭建

  1. 从GitHub上迁出vue3(vue-next)源码:
 git clone https://github.com/vuejs/vue-next.git 
  1. 安装依赖: 用yarn 加上–ignore-scripts会快很多
 yarn --ignore-scripts  
  1. 在package.json 文件中的script项中添加 --sourcemap 配置映射源码,⽣成sourcemap⽂件,以方便查看源码,
"dev": "node scripts/dev.js --sourcemap"  
  1. 运行编译:
yarn dev

编译完成后得到如下js文件

packages\vue\dist\vue.global.js  // vue.global.js 就是 vue3生成后的文件啦!
packages\vue\dist\vue.global.js.map
  • 如果要调试范例代码就运行如下命令:
yarn serve 

vue-next项目结构

源码位置是在packages目录中,实际上源码主要分为两部分,编译器 和 运⾏时环境。
在这里插入图片描述

  • 编译器

    • compiler-core 核⼼编译逻辑

    • compiler-dom 针对浏览器平台编译逻辑

    • compiler-sfc 针对单⽂件组件编译逻辑

    • compiler-ssr 针对服务端渲染编译逻辑

  • 运⾏时环境

    • runtime-core 运⾏时核⼼

    • runtime-dom 运⾏时针对浏览器的逻辑

    • runtime-test 浏览器外完成测试环境仿真

  • reactivity 响应式逻辑

  • template-explorer 模板浏览器

  • vue 代码⼊⼝,整合编译器和运⾏时

  • server-renderer 服务器端渲染

  • share 公⽤⽅法


初探Vue3

<!DOCTYPE html>
<html lang="en">

	<head>
	    <meta charset="UTF-8">
	    <meta name="viewport" content="width=device-width, initial-scale=1.0">
	    <title>vue-next</title>
	    <script src="../dist/vue.global.js"></script>
	</head>
	
	<body>
		<div id="app">
			<h1 @click="onclick">{{message}}</h1>
			<comp></comp>
		</div>
		<script>
			const { createApp } = Vue;
			// vue实例化
			const app = createApp({
				components: {
					comp: {
						template: '<div>this is a component</div>'
					}
				},
				data: { message: 'Hello Vue3!' },
				methods: {
					onclick() {
						console.log('ok 666');
					}
				},
			}).mount('#app');
		</script>
		
	</body>
</html>

Composition API

Composition API字⾯意思是组合API,它是为了实现基于函数逻辑复⽤机制⽽产⽣的。

<!DOCTYPE html>
<html lang="en">

	<head>
	    <meta charset="UTF-8">
	    <meta name="viewport" content="width=device-width, initial-scale=1.0">
	    <meta http-equiv="X-UA-Compatible" content="ie=edge">
	    <title>Composition API</title>
	    <script src="../dist/vue.global.js"></script>
	</head>
	
	<body>
	    <div id="app">
	        <h1>Composition API</h1>
	        <hr />
	
	        <div @click="add">点我试试: {{ state.count }}</div>
	
	        <h3>toRefs解构后,前面不用加data啦: {{text}}</h3>
	
	        <h3>{{time}}</h3>
	
	        <h2>doubleCount: {{doubleCount}}</h2>
	    </div>
	    <script>
	        const { createApp, reactive, computed, watch, onMounted, toRefs } = Vue;
	
	        // 声明组件
	        const App = {
	
	            // setup是⼀个新的组件选项,它是组件内使⽤Composition API的⼊⼝
	            // 调⽤时刻是初始化属性确定后,beforeCreate之前
	            setup() {
	                // 数据响应式:接收⼀个对象,返回⼀个响应式的代理对象
	                const state = reactive({
	
	                    count: 0,
	
	                    // 计算属性 computed()返回⼀个不可变的响应式引⽤对象
	                    // 它封装了getter的返回值
	                    doubleCount: computed(() => {
	                        return state.count * 2;
	                    })
	                });
	
	                // 可以随处声明多个初始数据(在vue2中只能在data(){return{xxx:xxx}})
	                const data = reactive({
	                    text: 'Hello Vue-Next',
	                    time: new Date().toLocaleTimeString()
	                });
	
	                //侦听器:watch()
	                // state.count变化cb会执⾏
	                watch(() => state.count, (newVal, oldval) => {
	                    console.log('count变了:' + newVal);
	                });
	
	                onMounted(() => {
	                    console.log('组件实例化完成啦!');
	
	                    setInterval(function () {
	                        data.time = new Date().toLocaleTimeString()
	                    }, 1000);
	                })
	
	                // 添加事件:声明⼀个add函数
	                function add() {
	                    state.count++
	                };
	
	                // 返回对象将和渲染函数上下⽂合并
	                return { state, ...toRefs(data), add }
	            }
	        };
	
	        createApp(App).mount('#app');
	    </script>
	    
	</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值