All posts by 龙生
最全的 Vue 面试题+详解答案
前言 本文整理了高频出现的 Vue 相关面试题并且附带详解答案 难度分为简单 中等 困难 三种类型 大家可以先不看答案自测一下自己的 Vue 水平哈 如果对原理感兴趣的同学 欢迎查看小编的手写 Vue 源码系列文章 如果对答案有不一样见解的同学欢迎评论区补充讨论 最后欢迎大家点击 链接 加入到鲨鱼哥的前端群 内推 讨论技术 摸鱼 求助 皆可(进群免费领取 Vue2 源码思维导图哈) 整理不易 如果觉得本文有帮助 记得点赞三连哦 十分感谢! 简单 1 MVC 和 MVVM 区别 MVC MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范 Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据 View(视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的 Controller(控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据 MVC 的思想:一句话描述就是 Controller 负责将 Model 的数据用 View 显示出来,换句话说就是在 Controller 里面把 Model 的数据赋值给 View。 MVVM MVVM 新增了 VM 类 ViewModel 层:做了两件事达到了数据的双向绑定 一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。 MVVM 与 MVC 最大的区别就是:它实现了 View 和 Model 的自动同步,也就是当 Model 的属性改变时,我们不用再自己手动操作 Dom 元素,来改变 View 的显示,而是改变属性后该属性对应 View 层显示会自动改变(对应Vue数据驱动的思想) 整体看来,MVVM 比 MVC 精简很多,不仅简化了业务与界面的依赖,还解决了数据频繁更新的问题,不用再用选择器操作 DOM […]
View Details最全的TypeScript学习指南
前言 Hello 大家好 我是鲨鱼哥 这次给大家带来的是我曾经非常嫌弃 如今却爱不释手的 TS 技术 哈哈 大家看往期文章可能已经发现鲨鱼哥之前主要是 Vue 技术栈的 然后因为 Vue2 和 TS 的结合总感觉不是很丝滑 所以我果断就在技术选型的时候去掉了 TS(其实我是觉得用起来很烦 和我之前最讨厌的 eslint 一样 各种报错让人不爽)但是 鲨鱼哥今年换了新公司 开启了全新的 react hook+ts 这一套组合拳 然后在重新认真学习并在项目里用上了 ts 之后 确实真香 哈哈 最直观的感受就是可以帮我们规避很多类型错误 更友好的提示 甚至有些方法我们根据定义的类型大概就知道作用是什么了(去掉了写注释的麻烦)况且如今大火的 Vue3 也是 TS 重构的 然后 react 和 ts 的结合就更不必说了 所以还没有开始 ts 的同学就从现在开始跟着鲨鱼哥一起来学习吧 最后欢迎大家点击 链接 加入到鲨鱼哥的前端群 内推 讨论技术 摸鱼 求助 皆可 整理不易 如果觉得本文有帮助 记得点赞三连哦 十分感谢! 1 ts 安装和编译 第一步 新建一个空文件夹用来学习 ts 第二步 全局安装 ts 和 ts-node
1 2 |
cnpm i typescript -g //全局安装ts cnpm i -g ts-node //全局安装ts-node |
第三步 生成 tsconfig.js 配置文件
1 |
tsc --init |
我们就先按照自动生成的 tsconfig 配置项去使用 里面的配置咱们可以先不去管他 后续熟练了再去配置 第四步 在项目下新建一个index.ts 直接写入
1 2 |
const a: string = "hello"; console.log(a); |
[…]
View DetailsTypeScript+Vue实例完全教程
功能 轮播 搜索 列表 懒加载 简单动画 loading vue-router.ts vuex.ts vue-class-component使用 vuex-class使用 xxx.d.ts声明文件 基于类的编写方式 mock数据 tsconfig.json webpack配置 vue-typescript-cli 项目地址:https://github.com/SimonZhangITer/vue-typescript-dpapp-demo 完成后的简单例子 基于类的写法加上静态类型检查,简直不能再嗨
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<script lang="ts"> import Vue from "vue"; import Component from "vue-class-component"; import { State } from "vuex-class"; @Component export default class Shops extends Vue { @State shops: StoreState.shop[]; @State searchVal: string; get shopList(): StoreState.shop[] { const shops = this.shops; const searchVal = this.searchVal; return shops.filter( (el: StoreState.shop) => el.shopName.indexOf(searchVal) > -1 ); } } </script> |
为什么使用TypeScript JavaScript的超集 支持所有原生JavaScript的语法 强类型语言 现在很多主流语言都是强类型的,而这点也一直是JavaScript所被人诟病的地方。使用TypeScript之后,将会在代码调试、重构等步骤节省很多时间。 比如说:函数在返回值的时候可能经过复杂的操作,那我们如果想要知道这个值的结构就需要去仔细阅读这段代码。那如果有了TypeScript之后,直接就可以看到函数的返回值结构,将会非常的方便 强大的IDE支持 现在的主流编辑器如VSCode、WebStorm、Atom、Sublime等都对TypeScript有着非常友好的支持,主要体现在智能提示上,非常的方便 可运行于任何浏览器、计算机、操作系统 强大的编译引擎 迭代更新快 不断更新,提供更加方便友好的Api 微软和Google爸爸 TypeScript是微软开发的语言,而Google的Angular使用的就是TypeScript,所以不用担心会停止维护,至少在近几年内TypeScript都会一门主流开发语言 npm下载量非常高 截止2017.12.17, TypeScript在全球范围内的npm日均下载量在30w左右,这个数字将近是vue下载量的10倍,可见TypeScript还是非常受欢迎的 TypeScript配置 本项目已经配置完毕,这里记录一下当时的踩坑过程 1. Webpack 首先需要安装ts-loader,这是TypeScript为Webpack提供的编译器,类似于babel-loader
1 |
npm i ts-loader -D |
接着在Webpack的module.rules里面添加对ts的支持(我这里的webpack版本是2.x):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, { test: /\.tsx?$/, exclude: /node_modules/, use: [ "babel-loader", { loader: "ts-loader", options: { appendTsxSuffixTo: [/\.vue$/] } } ] } |
2. tsconfig.json 创建tsconfig.json文件,放在根目录下,和package.json同级 配置内容主要也看个人需求,具体可以去typescript的官网查看,但是有一点需要注意: 在Vue中,你需要引入 strict: true (或者至少 noImplicitThis: true,这是 strict 模式的一部分) 以利用组件方法中 this 的类型检查,否则它会始终被看作 any 类型。 这里列出我的配置,功能在注释中给出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
{ "include": [ "src/*", "src/**/*" ], "exclude": [ "node_modules" ], "compilerOptions": { // types option has been previously configured "types": [ // add node as an option "node" ], // typeRoots option has been previously configured "typeRoots": [ // add path to @types "node_modules/@types" ], // 以严格模式解析 "strict": true, // 在.tsx文件里支持JSX "jsx": "preserve", // 使用的JSX工厂函数 "jsxFactory": "h", // 允许从没有设置默认导出的模块中默认导入 "allowSyntheticDefaultImports": true, // 启用装饰器 "experimentalDecorators": true, "strictFunctionTypes": false, // 允许编译javascript文件 "allowJs": true, // 采用的模块系统 "module": "esnext", // 编译输出目标 ES 版本 "target": "es5", // 如何处理模块 "moduleResolution": "node", // 在表达式和声明上有隐含的any类型时报错 "noImplicitAny": true, "lib": [ "dom", "es5", "es6", "es7", "es2015.promise" ], "sourceMap": true, "pretty": true } } |
3. 修改main.js 把项目主文件main.js修改成main.ts,里面的写法基本不变,但是有一点需要注意: 引入Vue文件的时候需要加上.vue后缀,否则编辑器识别不到 把webpack的entry文件也修改成main.ts 4. vue-shims.d.ts TypeScript并不支持Vue文件,所以需要告诉TypeScript*.vue文件交给vue编辑器来处理。解决方案就是在创建一个vue-shims.d.ts文件,建议放在src目录下再创建一个typings文件夹,把这个声明文件放进去,如:src/typings/vue-shims.d.ts,文件内容: *.d.ts类型文件不需要手动引入,TypeScript会自动加载
1 2 3 4 |
declare module '*.vue' { import Vue from 'vue' export default Vue } |
到这里TypeScript在Vue中配置就完成了,可以愉快的撸代码了~ 第三方插件库 现在Vue官方已经明确提出支持TypeScript,并考虑出一个对应的vue-cli,在这之前,Vue开发团队已经开发出了一些插件库来支持TypeScript,这里简单和大家介绍一下。 Vue-Class-Component vue-class-component是官方维护的TypeScript装饰器,写法比较扁平化。Vue对其做到完美兼容,如果你在声明组件时更喜欢基于类的 API,这个库一定不要错过 ps:用了这个装饰器之后写方法不需要额外加逗号,贼嗨~~~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import Vue from "vue"; import Component from "vue-class-component"; @Component export default class App extends Vue { name:string = 'Simon Zhang' // computed get MyName():string { return `My name is ${this.name}` } // methods sayHello():void { alert(`Hello ${this.name}`) } mounted() { this.sayHello(); } } |
[…]
View DetailsLinux目录创建、删除软链接
创建软链接
1 |
ln -s /www/jthycore/Upload /www/jthycore/wwwroot/ |
删除软链接
1 |
rm -rf /www/jthycore/wwwroot/Upload |
View Details
.NET Core log4net 使用
log4net .NET Core 版使用,log4net 2.0.7版发布也有一段时间了,从2.0.6 版开始就已经支持.NET Core。 之前有介绍NLog .NET Core版的使用,ASP.NET Core 开发-Logging 使用NLog 写日志文件。 ASP.NET Core已经内置了日志支持,可以轻松输出到控制台。使用log4net 将日志写入到文件及输出控制台。 .NET Core项目使用 新建一个 .NET Core 项目,选择控制台应用程序。 添加引用: Install-Package log4net 使用简单配置,将日志输出至控制台,跟之前.NET 版本略微有些区别,需要指定Repository 。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static void Main(string[] args) { ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository"); // 默认简单配置,输出至控制台 BasicConfigurator.Configure(repository); ILog log = LogManager.GetLogger(repository.Name,"NETCorelog4net"); log.Info("NETCorelog4net log"); log.Info("test log"); log.Error("error"); log.Info("linezero"); Console.ReadKey(); } |
运行程序显示如下: 下面增加配置,让其输出至文件。 在项目中添加一个配置文件,这里添加一个log4net.config ,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- This section contains the log4net configuration settings --> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" /> </appender> <appender name="FileAppender" type="log4net.Appender.FileAppender"> <file value="log-file.log" /> <appendToFile value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="logfile/" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <staticLogFileName value="false" /> <datePattern value="yyyyMMdd'.log'" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="1MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!-- Setup the root category, add the appenders and set the default level --> <root> <level value="ALL" /> <appender-ref ref="ConsoleAppender" /> <appender-ref ref="FileAppender" /> <appender-ref ref="RollingLogFileAppender" /> </root> </log4net> </configuration> |
这里定义了三个 Appender,都会起作用,然后日志级别ALL 所有的日志都会记录。 更改Program.cs 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void Main(string[] args) { ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository"); <strong>XmlConfigurator.Configure(repository, new FileInfo("log4net.config"</strong><strong>));</strong> ILog log = LogManager.GetLogger(repository.Name,"NETCorelog4net"); log.Info("NETCorelog4net log"); log.Info("test log"); log.Error("error"); log.Info("linezero"); Console.ReadKey(); } |
加了指定配置文件。运行程序会生成一个文件夹和一个文件,因为重新定义了ConsoleAppender,控制台输出也有所不同。 ASP.NET Core项目使用 在ASP.NET Core 使用也是一样,可以在Program.cs或Startup.cs 中指定Repository,然后控制器或中间件中获取对象使用。 以下代码是在Startup 构造函数中初始化log4net
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Startup { public static ILoggerRepository repository { get; set; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); repository = LogManager.CreateRepository("NETCoreRepository"); XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); } |
然后在Configure 中加了一个记录日志
1 2 3 4 |
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var log = LogManager.GetLogger(repository.Name,typeof(Startup)); log.Info("test"); |
在HomeController 也增加了:
1 2 3 4 5 6 7 |
private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HomeController)); public IActionResult Index() { log.Info("index view"); log.Error("Controller Error"); return View(); } |
运行应用结果如下,然后对应的文件会有日志记录。 对于输出中文乱码,需要增加编码引用,以及代码。NLog 那篇文章有介绍。写到日志文件是没有问题的。 参考文档: http://logging.apache.org/log4net/release/manual/configuration.html http://logging.apache.org/log4net/release/config-examples.html 如果你觉得本文对你有帮助,请点击“推荐”,谢谢。 ASP.NET Core 3.1 新书发布 《ASP.NET Core项目开发实战入门》 京东当当淘宝 GitHub:https://github.com/linezero 博客示例代码GitHub:https://github.com/linezero/Blog from:https://www.cnblogs.com/linezero/p/log4net.html
View Details.netCore 反射 :Could not load file or assembly 系统找不到指定文件
“System.IO.FileNotFoundException:“Could not load file or assembly 'ClassLibrary2, Culture=neutral, PublicKeyToken=null'. 系统找不到指定的文件。”” 在 .net 程序开发中我们会经常用到反射,最近在开始慢慢接触 .netCore。Core 反射的语法也是一样的,所以写下来也没有什么问题,但是一运行,就弹出了开头的 异常。 项目结构如下 ClassLibrary3 是一个接口
1 2 3 4 5 6 7 |
namespace ClassLibrary3 { public interface IClass1 { void Print(); } } |
ClassLibrary2 是 ClassLibrary3 的实现
1 2 3 4 5 6 7 8 9 10 |
namespace ClassLibrary2 { public class Class1:IClass1 { public void Print() { Console.WriteLine("Print....."); } } } |
主程序通过反射获取到到类型并创建对象
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Assembly assembly = Assembly.Load(new AssemblyName("ClassLibrary2")); Type type = assembly.GetType("ClassLibrary2.Class1"); var instance = (IClass1)Activator.CreateInstance(type); instance.Print(); Console.ReadLine(); } } |
这代码都这里没有问题,但是执行的时候却抛出了 开篇的异常。仔细检查了下,ClassLibrary2 生成的 dll 确认已经是复制到了主程序目录下。 刚开始接触Core 也没有系统去熟悉,最后经过多方努力后,发现在主程序项目下有个 deps.json 的文件 文件内容是这样的(里面没有 ClassLibrary2 因为我们没有在项目中引用 ClassLibrary2) 然后想着 那异常提示找不到路径,那我们在这里配置下不久可以了? 然后改成如下: 这时候我们运行程序: 完美! from:https://www.cnblogs.com/mengtree/p/7139108.html
View DetailsKubernetes(一) 跟着官方文档从零搭建K8S
前言 本文将带领读者一起, 参照着Kubernetes官方文档, 对其安装部署进行讲解. Kubernetes更新迭代很快, 书上、网上等教程可能并不能适用于新版本, 但官方文档能. 阅读这篇文章你能收获到: 如何阅读Kubernetes官方安装指南并搭建一个Kubernetes环境. Kubernetes安装过程中的注意事项. 避过常见的坑. 阅读本文你需要: 熟悉Linux命令. 知道Kubernetes是用来干什么的 (不然装它干啥(ಥ_ಥ)). 知道Docker 器材准备 文档链接: Before you begin 序号 名称 数量 备注 1 服务器 2 操作系统: Linux(centos7, 其它操作系统也可, 安装过程类似, 可参考官方文档) 机器配置: CPU >= 2, 内存 >= 2G 从官网找到kubeadm安装文档入口, 文档很详细. 英文阅读没有障碍的读者推荐直接查看英文文档, 中文文档不全且更新不及时安装时可能存在问题. 前期准备 笔者已经预先安装好了两台虚拟机, centos7(CPUx2, 内存2.5G). 并在路由器上固定了这两个虚拟机的IP地址. 修改hostname
1 2 3 |
[root@k8s-master ~]$ vim /etc/hostname # 修改hostname [root@k8s-master ~]$ vim /etc/hosts # 将本机IP指向hostname [root@k8s-master ~]$ reboot -h # 重启(可以做完全部前期准备后再重启) |
修改后, 两台虚拟机的配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# in k8s-master [root@k8s-master ~]$ cat /etc/hostname k8s-master [root@k8s-master ~]$ cat /etc/hosts | grep k8s 10.33.30.92 k8s-master 10.33.30.91 k8s-worker # in k8s-worker [root@k8s-worker ~]$ cat /etc/hostname k8s-worker [root@k8s-worker ~]$ cat /etc/hosts | grep k8s 10.33.30.92 k8s-master 10.33.30.91 k8s-worker |
确认MAC和product_uuid的唯一性 文档链接: Verify the MAC address and product_uuid are unique for every node
1 2 |
[root@k8s-master ~]$ ifconfig -a # 查看MAC [root@k8s-master ~]$ cat /sys/class/dmi/id/product_uuid # 查看product_uuid |
注: 如果你的centos7没有ifconfig命令, 可以执行yum install net-tools进行安装. 配置防火墙 文档链接: Check required ports 由于是本地内网测试环境, 笔者图方便, 直接关闭了防火墙. 若安全要求较高, 可以参考官方文档放行必要端口.
1 2 |
[root@k8s-master ~]$ systemctl stop firewalld # 关闭服务 [root@k8s-master ~]$ systemctl disable firewalld # 禁用服务 |
[…]
View Details《K8S权威指南》读书笔记-入门篇
一. k8s介绍 1. 是什么 kubernetes:古希腊“舵手”的意思(指引鲸鱼-docker) Production-Grade Container Orchestration:生产级别的容器编排系统 is an open-source system for automating deployment, scaling, and management of containerized applications:用于自动部署,扩展和管理容器化应用程序的开源系统 2. 发展历程 google内部使用十年之久的大规模机器管理系统-Borg,k8s是其他开源版本。 2014年6月 谷歌在旧金山的发布会为这款新的开源工具揭牌 2015年4月:google发布论文,高调宣传k8s 2015年7月:发布1.0版本 2015-2016:1.0-1.5,主要发布了五个版本 2017年: 相继推出 1.6、1.7、1.8、1.9,围绕稳定性、性能和平台的 cloud availability 做了改进 2018年3月27日,v1.10 发布。此版本持续增强了 Kubernetes 2018年6月28 日,v1.11 发布。此版本增强了网络功能、可扩展性与灵活性。Kubernetes 1.11 功能的更新为任何基础架构、云或内部部署都能嵌入到 Kubernetes 系统中增添了更多可能性的成熟性、可扩展性以及可插拔性,并在存储、安全、网络增强了其稳定性 2018年9月28日,v1.12 发布。此版本新增了两个备受期待的功能,Kubelet TLS Bootstrap 和对 Azure 虚拟机规模集支持(并已达到 GA 阶段)。同时该版本在安全性和 Azure 等关键功能上作出了改进; 2018年12月4日,v1.13发布。此版本的三个主要特性已逐渐过渡到 GA。此版本中的显着特征包括:使用 kubeadm 简化集群管理、Container Storage Interface(CSI)、以 CoreDNS 作为默认 DNS 大约每100天更新一次,如今已是 V 1.15.0版本(2019.7.17) 3. 特点 一切以服务为中心 自动化:自我扩展、自我诊断 底层不仅仅依赖docker,还支持Rocket 不局限于语言,对现有代码、框架没有任何侵入 4. 功能 基于容器的、一站式的分布式平台和分布式解决方案 主要功能是生产环境的容器编排,包括: 滚动升级 在线扩缩容 资源自动调度 资源配额管理 服务注册、服务发现 负载均衡 故障发现和自我修复 5. 为什么要用k8s 容器逐渐替代宿主机,k8s是业界广泛认可和看好的容器分布式解决方案 […]
View Details