精华内容
下载资源
问答
  • 管理/更新/下载App,跟踪优惠信息 $29.99/year # ★★★ Spotify Pro 音乐服务 $9.99/month # ★★★ Rdio Pro 音乐服务 $9.99/month # ★★★ iTunes Match iTunes 音乐服务 $24.99/year # ★★★ ...
  • 1.创建一个vite项目npm init vite-app cd npm installnpm run dev或者yarn create vite-app cd yarnyarn dev2.vite简介vite 是一...即时的热模块更新,替换性能和模块数量的解耦让更新飞起;真正的按需编译,不再等...

    1.创建一个vite项目

    npm init vite-app

    cd

    npm install

    npm run dev

    或者

    yarn create vite-app

    cd

    yarn

    yarn dev

    2.vite简介

    vite 是一个基于 Vue3 单文件组件的非打包开发服务器,它做到了本地快速开发启动:

    快速的冷启动,不需要等待打包操作;

    即时的热模块更新,替换性能和模块数量的解耦让更新飞起;

    真正的按需编译,不再等待整个应用编译完成,这是一个巨大的改变。

    并且vite也成功地革了webpack的命,让webpack开发者直接喊大哥:

    尤神放弃webpack

    那么vite是如何做到这些的呢?

    3.第一个疑问

    通过运行npm run dev,可以观察到这个项目是秒级打开,打开调试器可以看到:

    模块请求

    浏览器直接请求了.vue文件,并且后面带了一些type参数。点击这些请求,简单查看一下文件返回内容:

    //main.js

    import { createApp } from '/@modules/vue.js'

    import App from '/src/App.vue' //

    import '/src/index.css?import' //

    createApp(App).mount('#app')

    最直观地看到这里:

    将vue引用转化为/@modules/vue.js

    将./App.vue转换为/src/App.vue

    将./index.css转化为/src/index.css?import

    //HelloWorld.vue?type=style&index=0

    import { updateStyle } from "/vite/hmr"

    const css = "\np{color: red;}\n"

    updateStyle("62a9ebed-0", css)

    export default css

    这里编译了Helloworld.vue中的style样式,将p{color:red}进行了编译;

    //index.css?import

    import { updateStyle } from "/vite/hmr"

    const css = "#app {\n font-family: Avenir, Helvetica, Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-align: center;\n color: #2c3e50;\n margin-top: 60px;\n}\n"

    updateStyle("\"2418ba23\"", css)

    export default css

    同时还对全局样式进行了更新监听。

    既然浏览器直接请求了.vue 文件,那么文件内容是如何做出解析的呢。项目是如何在不使用webpack等打包工具的条件下如何直接运行vue文件。

    3.1挖掘vite运行原理

    从上面的代码片段中可以看到,最明显的特征就是使用了ES Module,代码以模块的形式引入到文件,同时实现了按需加载。

    其最大的特点是在浏览器端使用 export import 的方式导入和导出模块,在 script 标签里设置 type="module" ,然后使用 ES module。

    正因如此,vite高度依赖module script特性,也就意味着从这里开始抛弃了IE市场,参见Javascript MDN。

    在这种操作下,伴随的另一个效果就是去掉了webpack打包步骤,不用再将各个模块文件打包成一个bundle,以便支持浏览器的模块化加载。那么vite是如何处理这些模块的呢?

    关键在于vite使用Koa构建的服务端,在createServer中主要通过中间件注册相关功能。

    vite 对 import 都做了一层处理,其过程如下:

    在 koa 中间件里获取请求 body

    通过 es-module-lexer 解析资源 ast 拿到 import 的内容

    判断 import 的资源是否是绝对路径,绝对视为 npm 模块

    返回处理后的资源路径,例如:"vue" => "/@modules/vue"

    将处理的template,script,style等所需的依赖以http请求的形式,通过query参数形式区分并加载SFC文件各个模块内容。

    为什么这里需要@modules?

    举个栗子:

    import vue from 'vue'

    vue模块安装在node_modules中,浏览器ES Module是无法直接获取到项目下node_modules目录中的文件。所以vite对import都做了一层处理,重写了前缀使其带有@modules,以便项目访问引用资源;另一方面,把文件路径都写进同一个@modules中,类似面向切片编程,可以从中再进行其他操作而不影响其他部分资源,比如后续可加入alias等其他配置。

    通过koa middleware正则匹配上带有@modules的资源,再通过require('XXX')获取到导出资源并返给浏览器。

    3.2文件请求

    单页面文件的请求有个特点,都是以*.vue作为请求路径结尾,当服务器接收到这种特点的http请求,主要处理

    根据ctx.path确定请求具体的vue文件

    使用parseSFC解析该文件,获得descriptor,一个descriptor包含了这个组件的基本信息,包括template、script和styles等属性 下面是Comp.vue文件经过处理后获得的descriptor

    然后根据descriptor和ctx.query.type选择对应类型的方法,处理后返回ctx.body

    type为空时表示处理script标签,使用compileSFCMain方法返回js内容

    type为template时表示处理template标签,使用compileSFCTemplate方法返回render方法

    type为styles时表示处理style标签,使用compileSFCStyle方法返回css文件内容

    在浏览器里使用 ES module 是使用 http 请求拿到的模块,所以 vite 必须提供一个web server 去代理这些模块,上文中提到的 koa中间件 就是负责这个事情,vite 通过对请求路径query.type的劫持获取资源的内容返回给浏览器,然后通过拼接不同的处理单页面文件解析后的各个资源文件,最后响应给浏览器进行渲染。

    从另一方面来看,这也是一个非常有趣的方法,webpack之类的打包工具会把各种各样的模块提前打包进bundle中,但打包结果是静态的,不管某个模块的代码是否用得到,它都要被打包进去,显而易见的坏处就是随着项目越来越大,打包文件也越来越大。vite的优雅之处就在于需要某个模块时动态引入,而不是提前打包,自然而然提高了开发体验。

    4.hmr热更新

    vite的热更新主要有四步:

    通过 watcher 监听文件改动;

    通过 server 端编译资源,并推送新资源信息给 client ;

    需要框架支持组件 rerender/reload ;

    client 收到资源信息,执行框架 rerender 逻辑。

    在client端,Websocket监听了一些更新的消息类型,然后分别处理:

    vue-reload —— vue 组件更新:通过 import 导入新的 vue 组件,然后执行 HMRRuntime.reload

    vue-rerender —— vue template 更新:通过 import 导入新的 template ,然后执行 HMRRuntime.rerender

    vue-style-update —— vue style 更新:直接插入新的 stylesheet

    style-update —— css 更新:document 插入新的 stylesheet

    style-remove —— css 移除:document 删除 stylesheet

    js-update —— js 更新:直接执行

    full-reload —— 页面 roload:使用 window.reload 刷新页面

    在server端,通过watcher监听页面改动,根据文件类型判断是js Reload还是vue Reload。通过解析器拿到当前文件内容,并与缓存里的上一次解析结果进行比较,如果发生改变则执行相应的render。

    5.后续

    本文简述了vite的启动链路和背后的简易原理,虽然短时间内vite不会替代webpack,但是能够看到vite的强大潜力和不可阻挡的趋势。vite的更新实在是太快了,特别佩服尤大的勤奋和开源精神,目前还在快速迭代中,后续将会有单独的文章来分析各个内部原理实现,希望大家多多期待,有任何问题欢迎随时交流。

    欢迎大家关注作者公众号:前端优选

    展开全文
  • 很抱歉大家等了好几天,我就不再耽误时间了,我们马上切入正题。 上次日记中我跟大家提前透露了这篇日记将介绍一些与DbContext有关的内容。廖羽同学问了两个问题,他问的问题正好是我这次要讲的,我们怎么配置...

    因为家里有点事,就耽误了随后的更新。很抱歉让大家等了好几天,我就不再耽误时间了,让我们马上切入正题。

    上次日记中我跟大家提前透露了这篇日记将介绍一些与DbContext有关的内容。廖羽同学问了两个问题,他问的问题正好是我这次要讲的,我们怎么配置DbContext的子类访问的数据库的位置。

    我相信大家最经常使用的数据库位置的配置方式就是配置文件了,也就是通过App.Config 或Web.Config来配置要访问的数据库。

    Entity Framework Code First同样也可以通过配置文件来配置要访问的数据库的位置。

    我们可以再配置文件里添加一个连接字符串的配置来定义数据库的位置

    <connectionStrings>
            <add name="OrderSystemContext" connectionString="Data Source=XXX\SQL2008R2;Initial Catalog=OrderSystem;User Id=XXX;Password=XXX" providerName="System.Data.SqlClient"/>
        </connectionStrings>

    那么Code First怎么知道使用哪个连接字符串来找到要访问的数据库呢?

    默认情况下,Code First会在连接字符串的配置节中寻找与你自定的DbContext的子类同名的连接字符串。例如你自定义的DbContext的子类叫OrderSystemContext, 那么name是OrderSystemContext的连接字符串就是你程序中要访问的数据库的连接字符串。

    如果我们想改变数据库连接字符串的名字,而不用改变我们自定义的DbContext子类,我们就可以使用DbContext的另一个构造函数

    public OrderSystemContext(string databaseName)
                : base(databaseName)
            {

            }

     

    我们可以将连接字符串的名字作为参数传到DbContext子类的构造函数中,然后我们就可以让我们的DbContext子类和连接字符串的名字脱离关系了.

    OrderSystemContext unitOfWork = new OrderSystemContext("OrderSystem");

     

    App.Config

    <add name="OrderSystem" connectionString="Data Source=CNTSNWV0CN115\SQL2008R2;Initial Catalog=OrderSystem;User Id=ldsng;Password=welcome" providerName="System.Data.SqlClient"/>

    还有一个更简单的方式,如果你想使用固定的连接字符串的名字而不是通过参数把名字传进来,可以直接在默认构造函数中调用基类的构造函数,传入固定的连接字符串名称:

    public OrderSystemContext()
                :base("OrderSystem")
            {

            }

     

    如果我们程序中同时存在多个DbContext的子类的时候,Entity Framework会为每个DbContext的子类都创建一个数据库连接,那么我们的程序就保留了很多个数据库连接的实例。如果我们要优化我们的程序,就可以让多个DbContext子类使用同一个数据库连接实例。我们还是要通过重载DbContext的另一个构造函数来实现这个功能。

    DbContext的这个构造函数有两个参数,一个是我们要共用的数据库连接的实例,另一个是一个开关,用于控制是否由当前的DbContext子类控制数据库连接实例。如果contextOwnsContext属性为true,那么当DbContext子类Dispose的时候,就会把共用的DbConnection实例也Dispose掉。如果这个值是false,则数据库连接实例就需要由程序员自己写程序释放。

    public OrderSystemContext(DbConnection connection, bool contextOwnsConnection)
                : base(connection, contextOwnsConnection)
            {
            }

     

    然后我们可以使用这个构造函数,让我们的DbContext子类使用共用的数据库连接实例。

    string connectionString = @"Data Source=XXX\SQL2008R2;Initial Catalog=OrderSystem;User Id=XXX;Password=XXX";
               SqlConnection conn = new SqlConnection(connectionString);
               OrderSystemContext unitOfWork = new OrderSystemContext(conn,true);
               ProductRepository repository = new ProductRepository(unitOfWork);
               ProductCatalog catalog = repository.SearchProductCatalog(c => c.CatalogName == "DELL E6400", 1, 10)[0];
               Product product = new Product { Catalog = catalog, CreateDate = DateTime.Parse("2010-2-10"), ExpireDate = DateTime.Parse("2012-2-10") };
               repository.AddNewProduct(product);
               unitOfWork.CommitChanges();

    Entity Framework默认会通过一个实现了IDbConnectionFactory接口的类为我们自定义的DbContext类创建数据库连接。Entity Framework默认提供一个SqlConnectionFactory类用来创建SQL Server的数据库连接。Entity Framework Code First中Database.DefaultConnectionFactory属性存储就是SqlConnectionFactory的对象。

    你可以初始化一个新的SqlConnectionFactory的实例,把它赋给Database.DefaultConnectionFactory属性,你还可以在初始化SqlConnectionFactory的时候,将一些数据库配置传进去覆盖Code First的默认数据库连接配置

    Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Server=XXX\SQL2008R2;Initial Catalog=OrderSystem;User Id=XXX;Password=XXX");

    但是有一点比较坑爹,大家一定要牢记,你设置的数据库连接配置中的数据库名是无效的。当我使用上面的代码配置数据库时,建立的数据库的名字不是你在SqlConnectionFactory的构造函数中指定的OrderSystem,而是你的DbContext子类的全名(命名空间.类名)

    如果你要是想使用自定义的数据库名称,你需要重载DbContext子类的构造函数。

    public OrderSystemContext(string databaseName)
                : base(databaseName)
            {

            }

    在你使用SqlConnectionFactory的情况下,你传入的databaseName就是你要访问的数据库的名字,而不像上面的实例中那样是连接字符串的名字。

    OrderSystemContext unitOfWork = new OrderSystemContext("OrderSystem");

     

    通过这篇日记,大家已经清楚怎样配置数据库连接。我已经介绍过如何配置数据表中列的属性,下一次日记中,我将介绍一些高级的列属性设置。

    转载于:https://www.cnblogs.com/lk8167/archive/2013/01/14/2859768.html

    展开全文
  • 楼主开发的目的也是想大家能够快速建立起微信公众平台(WXPP),据说现在开发个微信公众平台月薪可以达到10K,哈哈。 好久没被首推了,现在怎么申请首推啊? 此次更新的内容: 1、去除了Model类库,合并到WX....
  • Angular 11 正式发布:加入 webpack 5,升级至 TS 4.0,不再支持 IE 9 和 10 Understanding React's useReducer Hook How to use SVG Icons as React Components Ionic Vue: The UI library for Vue 3 Simplifying ...
  • 本文我们从介绍flutter基本概念到梳理常用Widget到常用app demos编写到~放弃~,希望可以帮助每一个像我一样的初学者。有误地方还望大神不吝赐教~ <p><img alt="img" src=...
  • 那么,问题就来了,我书籍里面的文档越来越多,我怎么知道我要链接的那个文档的文档标识呢?不用担心,在markdown编辑器的左侧,括号里面的红色文字显示的就是你的文档标识。 采集功能 看到一篇很好的文章,但是...
  • 周志明大神写的,非常非常经典,已经更新到第三版了。Java 虚拟机也就是 JVM,JVM 是Java 面试必考的知识,不懂这个直接回家等消息吧。这边书我看了很多遍,每次看完都有新的收获,墙裂建议大家看完。 《Java 并发...
  • <p><em>想跳过技术细节直接看怎么实践的同学可以拖到文章底部,直接看最后一节。</em></p> 目前社区有很多关于微前端架构的介绍,但大多停留在概念介绍的阶段。而本文会就某一个具体的类型场景,...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    Android 的 App Market 模式,软件开发者获得 7 成收入, 3 成用于系统维护。难点在于位置营销。 设备商通过卖设备、内置特色应用来获得盈利。也可以兼职专业软件开发者进行赢利。 Google 自身通过基于统一平台为...

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

怎么让app不再更新