前两天,Vercel突然推出了v0.dev,用户通过语言描述就能生成精美UI页面,小伙伴们惊掉了下巴。。
带着期待的心情对官网https://v0.dev一番摸索的探索,了解到v0是通过AI模型技术生成交互页面,当前官网的交互是基于Shadcn UI和Tailwind CSS,最终生成基于React的代码,可以直接复制到项目中使用,当然也可以直接把代码部署到Vercel上面,官方有计划后续对vue、Svelte等前端框架支持;
在官网上有一个用户输入提示词的输入框,用户输入提示词并且提交后,系统会提供出三种AI模型生成的用户界面供选择,我们可以选择任意一个复制粘贴其代码,当然也可以直接在系统上进行完善后复制到自己的项目当中去。如果想进一步优化,我们可以选择生成每个UI的小组件来微调代码,当然这还是需要一丢丢编程基础的。
由于V0还在内测阶段,当前开发者需要排队等待开发资格,我们以官网提供的一个天气预报交互界面为例来聊下如何去实现,最终效果如下面这张图:
从生成的源码可以看出这是一段简单的jsx代码,可以直接在react中使用,当然简单改吧一下vue中也能用。图标主要是基于svg生成的,这些在应用代码时可以替换成自己业务自有的图片。值得注意的是整个页面布局都是基于Tailwind CSS实现的,Tailwind提供css预定义能力,灵活度非常高,基本上通过预置的css类能够实现所有能想到的页面布局,到这也理解了为何V0使用Tailwind进行布局了。
/** * v0 by Vercel Labs. * @see https://v0.dev/t/bo2N7pU */ export defaultfunction Component() { return (<div className="flex flex-col h-screen bg-gradient-to-r from-blue-500 to-blue-700"> <div className="flex flex-col items-center p-6 space-y-4 w-500 mx-auto"> <h1 className="text-2xl font-semibold text-white">San Francisco</h1> <p className="text-sm text-gray-200">Monday, 12 April</p> <div className="flex flex-col items-center space-y-2"> <svg className=" h-20 w-20 text-gray-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" /> </svg> <p className="text-6xl font-bold text-white">72°</p> <p className="text-xl text-gray-300">Partly Cloudy</p> </div> </div> <div className="flex overflow-x-auto space-x-6 p-6 w-500 mx-auto"> <div className="flex flex-col items-center space-y-2"> <p className="text-sm font-medium text-white">4 PM</p> <svg className=" h-10 w-10 text-gray-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" /> </svg> <p className="text-lg font-semibold text-white">70°</p> </div> <div className="flex flex-col items-center space-y-2"> <p className="text-sm font-medium text-white">5 PM</p> <svg className=" h-10 w-10 text-yellow-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <circle cx="12" cy="12" r="4" /> <path d="M12 2v2" /> <path d="M12 20v2" /> <path d="m4.93 4.93 1.41 1.41" /> <path d="m17.66 17.66 1.41 1.41" /> <path d="M2 12h2" /> <path d="M20 12h2" /> <path d="m6.34 17.66-1.41 1.41" /> <path d="m19.07 4.93-1.41 1.41" /> </svg> <p className="text-lg font-semibold text-white">68°</p> </div> <div className="flex flex-col items-center space-y-2"> <p className="text-sm font-medium text-white">6 PM</p> <svg className=" h-10 w-10 text-gray-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" /> </svg> <p className="text-lg font-semibold text-white">65°</p> </div> <div className="flex flex-col items-center space-y-2"> <p className="text-sm font-medium text-white">7 PM</p> <svg className=" h-10 w-10 text-yellow-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <circle cx="12" cy="12" r="4" /> <path d="M12 2v2" /> <path d="M12 20v2" /> <path d="m4.93 4.93 1.41 1.41" /> <path d="m17.66 17.66 1.41 1.41" /> <path d="M2 12h2" /> <path d="M20 12h2" /> <path d="m6.34 17.66-1.41 1.41" /> <path d="m19.07 4.93-1.41 1.41" /> </svg> <p className="text-lg font-semibold text-white">63°</p> </div> </div> <div className="flex-1 overflow-y-auto space-y-6 p-6 w-500 mx-auto"> <div className="flex justify-between items-center mb-8 mr-4"> <p className="text-lg font-medium text-white">Tuesday</p> <div className="flex items-center space-x-4"> <svg className=" h-6 w-6 text-gray-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" /> </svg> <p className="text-lg font-semibold text-white">73° / 60°</p> </div> </div> <div className="flex justify-between items-center mb-8 mr-4"> <p className="text-lg font-medium text-white pr-4">Wednesday</p> <div className="flex items-center space-x-4"> <svg className=" h-6 w-6 text-yellow-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <circle cx="12" cy="12" r="4" /> <path d="M12 2v2" /> <path d="M12 20v2" /> <path d="m4.93 4.93 1.41 1.41" /> <path d="m17.66 17.66 1.41 1.41" /> <path d="M2 12h2" /> <path d="M20 12h2" /> <path d="m6.34 17.66-1.41 1.41" /> <path d="m19.07 4.93-1.41 1.41" /> </svg> <p className="text-lg font-semibold text-white">76° / 62°</p> </div> </div> <div className="flex justify-between items-center mb-8 mr-4"> <p className="text-lg font-medium text-white">Thursday</p> <div className="flex items-center space-x-4"> <svg className=" h-6 w-6 text-gray-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" /> </svg> <p className="text-lg font-semibold text-white">70° / 57°</p> </div> </div> <div className="flex justify-between items-center mb-8 mr-4"> <p className="text-lg font-medium text-white">Friday</p> <div className="flex items-center space-x-4"> <svg className=" h-6 w-6 text-gray-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" /> </svg> <p className="text-lg font-semibold text-white">70° / 57°</p> </div> </div> <div className="flex justify-between items-center mb-8 mr-4"> <p className="text-lg font-medium text-white">Saturday</p> <div className="flex items-center space-x-4"> <svg className=" h-6 w-6 text-yellow-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <circle cx="12" cy="12" r="4" /> <path d="M12 2v2" /> <path d="M12 20v2" /> <path d="m4.93 4.93 1.41 1.41" /> <path d="m17.66 17.66 1.41 1.41" /> <path d="M2 12h2" /> <path d="M20 12h2" /> <path d="m6.34 17.66-1.41 1.41" /> <path d="m19.07 4.93-1.41 1.41" /> </svg> <p className="text-lg font-semibold text-white">76° / 62°</p> </div> </div> <div className="flex justify-between items-center mb-8 mr-4"> <p className="text-lg font-medium text-white">Sunday</p> <div className="flex items-center space-x-4"> <svg className=" h-6 w-6 text-gray-300" fill="none" height="24" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" > <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" /> </svg> <p className="text-lg font-semibold text-white">70° / 57°</p> </div> </div> </div></div>) }
从目前提供的功能来看,实现一些简单的页面代码还是挺方便的,拿到代码改下就可以使用。复杂点的交互生成可能还没有那么完善,当然V0现在还在内测阶段,还有很大的优化空间。后面再配合AIGC语言大模型,跟它对话交流就能够实现一个功能完善的应用或许不在遥远。 很多前端同学可能会担心会不会被AI替代,我们从下面几个维度分析下:
AI的角色:
还有哪些限制:
总的来说,AI或者V0可以在某些方面辅助前端开发,提高效率和自动化一些重复性的任务,不太可能完全替代前端开发人员,特别是对于那些需要高度定制和创造性设计的项目。前端开发涉及到多个层面,包括技术、设计、用户体验等,这些层面需要人类的判断和创造力。当然如果作为前端开发只掌握了简单的页面切图,对于前端底层能力都不了解的话,被V0替代也是极有可能的。