自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 Sass-常用功能

sass是什么sass 是一种成熟的 css 拓展语言。兼容 css 语法,较为灵活,可以显著减少代码编写行数常见的 sass 文件有两种后缀:.sass 或.scss。.sass 采用缩进格式,且不需要分号。.scss 写法采用经典的大括号类似的代码块的写法.sass写法.hello width: 100px height: 100px border: 1px solid black.scss写法.hello { color: red;}sass 常用功能案例

2022-04-29 12:29:09 632

原创 vue3 组件规划方案

模板可以复用。模板通常伴随着业务。如果当前页面代码量过多,出现巨型组件。最好按块去拆下。目的是减少当前组件的代码行数,但是作为代价,需要多次设计组件的通信和多出 props(不提 emit 时间,是因为 props和 emit 是对等的。可以:on-click 传递一个回调函数,跟 react 那样,在子组件里调用父组件传进来的回调函数)业务逻辑业务逻辑可以借用 setup,将逻辑进行组合。把单独的逻辑放进单独的文件里组成逻辑的各个功能功能可以在上一步的业务逻辑文件里去实现对于可复用的逻

2021-11-23 10:48:04 706

原创 typescript 中使用库的方法

全局库-如JQuery检查库中有没有.d.ts 文件-true: 什么都不做-false: 编写.d.ts。放在目录中,如果可能,发布至@types因为是全局库,所以不需要 Exportnpm 安装的检查库中有没有自带的.d.ts-true : 什么也不做-false: 编写全局库,然后export 出来。...

2021-11-23 10:13:31 781

转载 代码覆盖率工具 Istanbul

代码覆盖率工具 Istanbul 入门教程代码覆盖率的 4 个纬度行覆盖率:是否每一行都执行了?函数覆盖率:是否每个函数都调用了?分支覆盖率: 是否每个代码块都执行了?语句覆盖率:是否每个语句都执行了使用npm install istanbul 使用istanbul cover命令,就能得到覆盖率$ istanbul cover simple.js===== Coverage summary =====Statements : 75% ( 3/4 )Branches

2021-09-29 14:46:33 620

转载 Mocha

MochaMocha是现在最流行的 Javascript 测试框架之一。在 Node 和浏览器环境都可以使用使用npm install mocha --global测试脚本的写法所谓"测试脚本",就是用来测试源码的脚本。// add.jsfunction add(x, y) { return x + y;}module.exports = add;// add.test.js// add.test.jsvar add = require('./add.js');var

2021-09-29 14:37:31 396

原创 rollup

概述Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码。Rollup 对代码模块使用 ES6 模块系统,ES6 模块可以使你自由、无缝地使用你最喜爱的 library 中那些最有用独立函数,而你的项目不必携带其他未使用的代码(tree-shaking)。ES6 模块最终还是要由浏览器原生实现(浏览器ESM),但当前 Rollup 可以使你提前体验。Tree-shaking除了使用 ES6 模块之外,Rollup 还静态分析代码中的 import,并将排除任何未实

2021-09-29 11:37:56 219

原创 在nodeJS 模块中写ESM模块

升级 node 版本至>=14.0配置 package.json"type": "module",

2021-09-29 10:33:11 511

原创 webpack_step7_chunk如何输出成具体文件

同步加载模块 JSfunction show(content) { window.document.getElementById("app").innerText = "Hello," + content;}// 通过 CommonJS 规范导出 show 函数module.exports = show;main.js 中引入import show from "./show";show("webpack");bundle.js(function (modules) { .

2021-09-28 15:34:22 122

原创 webpack_step6_编写一个loader

编写一个 loaderloader 是一个导出为一个函数的 node 模块本地测试方法可以通过简单的 rule 对象设置 path.resolve 指向这个本地文件module.exports = { //... module: { rules: [ { test: /\.js$/, use: [ { loader: path.resolve('path/to/loader.js'),

2021-09-27 16:11:53 64

原创 webpack_step5_loaderAPI

loader API所为 loader 只是一个到处为函数的 Javascript模块。webpack 内部会调用这个函数,然后把上一个 loader 产生的结果或者资源传进去。函数的 this 上下文将由 webpack 填充,并且 loader runner 具有一些有用方法,可以使 loader 改变为异步调用方式,或者获取 query 参数。第一个 loader 传入的参数只有一个,资源文件的内容。compiler 需要得到最后一个 loader 产生的处理结果。这个处理结果应该是 String

2021-09-27 15:48:02 130

原创 webpack_step4_创建一个插件

插件的构成一个插件由以下几个部分构成一个具名的 Javascript 函数在原型上定义 apply 方法指定一个触及到 webpack 本身的事件钩子操作 webpack 内部实例特定数据在实现功能之后调用webpack 提供的 Callbackapply 方法插件是由一个构造函数(此构造函数的 prototype 对象具有 apply 方法)所实例化出来的。这个 apply 方法在安装插件时,会被 webpack compilier 调用一次。apply 方法可以接收一个 webpck

2021-09-27 13:09:18 121

原创 webpack_step3_compiler 钩子

Compilier 模块是 webpack 的支柱引擎。通过 cli 或者 NodeAPI 传递的所有选项,创建出一个 compikation 实例。扩展自 Tapable 类。大部分钩子可以通过类似的方法访问compiler.hooks.someHook.tap(/* ... */);watchingCompiler 支持可以监控文件系统的监听(watching)机制,并且在文件修改时重新编译。entryOption在 webpack 选项中的 entry 配置项 处理过之后,执行插件

2021-09-27 11:18:54 270

原创 webpack_step3_插件 API

Plugin API插件通过Tapable类来提供插件接口。这个类保留 tap,tabAsync 和 tabPromise 方法,可以使用这些方法注入自定义构建步骤。而这些步骤将在整个编译过程中的不同时机触发,通常需要结合compiler hooks和插件内部暴露出来的钩子使用tap 用于触发同步钩子,例如进入一次新的构建 - compile 阶段tabAsync和tabPromise用来触发异步钩子。如 启动编译钩子 - run自定义钩子可以为其他插件的编译添加一个新的钩子,来触及到这些插件

2021-09-27 11:00:45 89

原创 webpack_step2_工作原理

流程初始化:从配置文件或是shell读取与合并参数,得到最终参数,实例化插件new Plugin()开始编译:通过上一步初始化得到的最终参数,初始化一个Compiler对象,加载插件(依次调用插件中的apply方法),通过执行Compiler.run开始编译确定入口:根据配置中entry找出所有入口文件编译模块:从entry出发,调用配置的loader,对模块进行转换,同时找出模块依赖的模块(如何找?见下文),依次递归,直到所有依赖模块完成本步骤处理完成模块编译:这一步已经使用loader对所有

2021-09-26 18:47:53 61

原创 webpack_step1_概念

webpack版本v_5.54核心概念入口(entry)输出loader插件模式浏览器兼容性webpack 应该使用哪个模块作为构建依赖图的开始output 属性告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件webpack 只能理解 JavaScript 和 JSON 文件。loader 让 webpack 能够去处理其他类型的文件loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务,如打包优化,注入文件通过选择

2021-09-26 15:57:10 73

原创 flex 布局

flex每个弹性容器都有两根轴:主轴和交叉轴,两轴之间成90度关系。注意:水平的不一定就是主轴。每根轴都有起点和终点,这对于元素的对齐非常重要。弹性容器中的所有子元素称为<弹性元素>,弹性元素永远沿主轴排列。容器属性flex-direction默认值: rowdiv { display: flex; flex-direction: row | coloum | row-reverse | column-reverse}flex-wrap默认值:no-wrap

2021-09-17 14:25:29 92

原创 Mock.js

Mock.jsmock.js 是一款数据模拟生成器。可以独立于后端,自行构建返回数据。可用于前后端分离的开发模式和单元测试使用方式// 安装npm install mockjs// 使用var Mock = require('mockjs');var data = Mock.mock({ 'list|1-10': [{ 'id|+1': 1 }]});语法规范mock.js 的语法规范分为两部分:数据模板定义数据占位符定义数据模板定义

2021-09-12 17:45:52 139

原创 安全方案-验证码

一、验证码的作用网络平台防止恶意注册(代码代替人去完成注册)提出的解决方案。攻击者可以自行构造客户端,短时间内发送多个注册成功的请求。二、仅靠前端实现的验证码是否安全?如果验证码仅仅由前端实现,这种场景下攻击者依然能绕过正规的客户端(浏览器),自行构造客户端去进行恶意注册。只是在构造请求时,多加一个验证码校验成功的参数而已。依然解决不了恶意注册的问题。三、正确解决方案用户输入完验证码之后,将输入传递给服务端,服务端去校验验证码是否正确(校验从单独的前端校验,转移到了后端的校验)这样就算攻击者绕过了

2021-09-12 17:15:31 301

原创 解决移动端 iphoneX 下吸底按钮被屏幕遮挡

<style> .div { position: absolute; bottom: 0; // 一般情况下 padding-bottom: calc(constant(safe-area-inset-bottom) + 20px); // 兼容 IphoneX padding-bottom: calc(env(safe-area-inset-bottom) + 20px) // 兼容 IphoneX }<

2021-09-07 18:51:23 753

原创 安卓下软件盘弹起使得底部按钮遮挡输入框

解决办法:软件盘弹起,隐藏按钮。收起时,再展示按钮<template><button v-show="isOriginHei">按钮</button><template><script>export default { name: 'Vue', data() { return { isOriginHei: true, // 按钮是否展示 screenHeight: document.documentE

2021-09-07 18:48:39 110

原创 数组排序方式

/* * @Author: 李灿 * @Date: 2021-07-04 12:18:54 * @LastEditTime: 2021-07-18 17:05:34 * @Description: 数组排序算法 * @FilePath: /demo/bubble.js *//** * @description: 冒泡排序 * @param {*} * @return {*} */function bubble() { let arr = [63, 4, 24, 1, 3, 15]

2021-07-18 17:06:48 64

原创 跨平台解决方案

CordovaCordova是一个apache 开源的跨平台框架,可以使用前端语言来实现跨平台 app。- 属于第一代跨平台方案,现在用纯 Cordova 做 app 的很少,Hibird 中出现的较多- 页面渲染使用的是 webView,与原生交互的时候需要借助原生注入在 webView 的方法来交互。- H5 与原生的交互还可以使用原生拦截 webview 发出的请求(链接)来实现react-native,weex页面渲染调用原生的组件,组件标签会被编译为原生组件去渲染。但是发布,环境安装收

2021-04-10 20:57:53 482 2

原创 requireJS

文件路径的书写方式require方法里的字符串数组参数允许不同的值,当字符串是以.js结尾,或以/ 开头,或是一个url时,RequireJS会认为用户是在直接加载一个JS文件;否则, 当字符串是类似my/modyle时,他会认为这是一个模块,并且会以用户配置的baseUrl和paths来加载相应的模块所在的JS文件。...

2021-03-14 22:26:21 283

原创 Chrom Debugger

解决的问题有时候接到一个代码量非常多的项目,如果看看页面,看看交互,再看着繁冗并且在不同文件中跳来跳去的代码仍然没有办法理清代码的执行过程。这时候在某个地方打一个断点,结合 Chrom Source 面板,可能会很清晰看到代码的执行步骤以及函数的执行过程主要用到的功能保存 log有时候因为页面跳转,log 自动清空刷新。可以点击右上角设置按钮,选择 preserve-log。console 和 network 面板都是一样的用法...

2021-03-14 22:24:41 75

原创 前端自动化部署

名词解释集成:在推送或者 merge 代码后自动进行构建打包交付:将上一步生成的代码包发布至测试、生产等环境需求在 git 代码仓库发生变化后,自动执行打包脚本,并且发布至服务器。解决的问题在之前每次开发完毕需要上线之前,需要手动执行 bash 命令打包,并且将打包后的代码人为的拖动至上传应用(FlileZilla Pro)。手动执行构建脚本消耗时间人力而拖动代码文件会存在拖拽错误,覆盖之前的其他项目代码等难以预料的问题工具选择gitlab/github/giteeJenki

2021-03-08 16:42:37 3100

原创 vue 组件通信的另一种方式

vue 通信方式(一般)props传递-父到子$emit - 子到父vuex - 全局共享设置到 this 原型上共享,或者其他全局方式共享子组件更新父组件的另一种方式方法是类似于 react 那样,往子组件里传递一个回调函数。在子组件里调用,函数在父组件里执行父组件<template> <receiveFunctionComponent :f="receiveFunctionComponenMethod" /> <h3> {{rec

2021-03-07 23:12:55 53

原创 H5 定位

navigator通过对宿主环境的navigator属性进行检测,是否存在geolocation属性,判断是否支持 H5 定位MDN 文档指出,Navigator.geolocation 只读属性返回一个 Geolocation 对象,通过这个对象可以访问到设备的位置信息Navigator.geolocationAPI 只支持 HTTPS 协议和一部分浏览器,如果不支持,需要用其他方式去兼容获取方法:navigator.geolocation.getCurrentPosition(success,

2021-03-07 22:53:21 683

原创 vue日历插件设计思路

规划显示title 为选择的具体年月日渲染每个月的天数一个月的天数显示星期几问题分析一个时间对象的 get[name]方法可以获取年月日:getDate, getDay, getMonth…获取月份的时候,月份为 index 索引,从 0 开始,所以真实月份为 getMonth+1借助 new Date ,这个对象可以作为参数,传入组件,从而渲染不同月份的日期。但是 new Date 传入字符串参数的时候,存在兼容性问题。所以采用 new Date(year, month, day)的

2021-03-04 18:02:20 370 1

原创 云服务器(SAE) 部署

静态页面可以借助 github,或者 gitee 的静态文件托管功能进行部署。区别于这些,以下步骤的目的是:将服务端的代码部署至公网并且搭建起来一个线上可以访问的页面,环境是真实的线上环境SAE 注册使用微博账号注册即可,注册成功可以赠送200云豆,这些云豆拿来做这次模拟注册完成之后,登录,到首页最下方选择“云应用 SAE”控制台这次测试不涉及数据库等,但是会有服务端的简单接口和从服务端拉去静态页面的简单操作点击“云应用 SAE””进入如下页面点击进入控制台,可以进行添加/创建应用

2021-03-02 18:00:11 528

原创 小程序 step13-基础库与小程序开发者工具

基础库小程序的基础库由 Javascript 编写,负责数据绑定,组件系统,通信等系统的运行提前置于微信客户端比较版本库的正确方法:function compareVersion(v1, v2) { v1 = v1.split('.') v2 = v2.split('.') var len = Math.max(v1.length, v2.length) while (v1.length < len) { v1.push('0') } while (v2.

2021-02-28 18:23:16 542

原创 小程序 step12-性能优化

优化启动时间小程序初始化的时候,会进行代码的下载控制代码包的大小可以减少初始化时间:删除不必要的标签结构,压缩图片等采用分包下载:只加载启动时必要的包(主包),app.json 中配置subPackages,除下subPackages下的包,都是主包优化页面通信setData合并,多次合并为一次。因为 setData 是逻辑层到视图层的通信,中间会经过 native 的中转视图层与逻辑层通信优化: 不要在节点的 data 前缀属性中放置过大的数据,因为事件绑定需要传递 dataset

2021-02-28 16:32:48 114

原创 小程序 step11_底层框架

小程序双线程模型分渲染层和逻辑层渲染层由 webview 负责渲染任务逻辑层是由 JScore 负责执行。(普通的混合 app 页面和逻辑都是在 webview 中进行的)渲染层,将 wxml,wxss经过编译之后,一部分由原生组件渲染(普通的 webview 智能用 html 能力,无法直接展示原生组件)。并且没有 DOM,BOM 对象可以访问逻辑层在单独的 JSCore 中,调用原生 api(摄像头等),发起网络请求,与逻辑层通信等,都是由原生做了一层中转一个 JSCore 对应多个 we

2021-02-28 16:12:06 221

原创 小程序 step10_场景应用

触摸反馈小程序的 view、button 的 hover-class 属性可以在触摸的时候给改组件加上对应的 class 改变样式。对于用户的触摸操作是个不错的体验有时候点击 button 的时候,需要进行一些耗时的操作,我们需要用到 button 的 loading 属性,在按钮文字前面出现一个 Loading对话框Toast我们用来提示用户这次操作成功,但是不打断用户接下来的操作showMoadal在进行错误提示的时候,我们需要告诉用户具体的原因,所以不可以使用

2021-02-28 15:22:55 79

原创 小程序 step9-宿主环境

小程序全局数据小程序 JS 脚本运行在 JSCore 中,小程序的每个页面各自有一个 web-view 线程进行渲染,所以小程序切换页面时,小程序的 JS 脚本依然在同一个 JSCore 中。所以 App实例是一个,不同页面之间可以通过 App 实例下的属性来共享数据。APP 构造器可以传递其他参数作为全局变量,达到全局数据共享的目的。因为所有的脚本逻辑都跑在同一个 JSCore 中,页面使用 SetTimeOut 或者setInterval 定时器时,在跳转其他页面之后,要进行清理页面构造器

2021-02-26 16:00:05 79

原创 小程序 step8-组件间通信

组件之间的通信方式有3 中wxml 数据绑定事件监听、事件触发父组件还可以通过 this.selectComponent 方法获取子组件实例对象,这样就可以直接访问组件的任意数据和方法。

2021-02-25 23:52:23 87

原创 小程序 step6-生命周期

App 生命周期onLaunch: 小程序装载完代码的时候调用onShow: 小程序切换至前台调用onHide:小程序切换至后台的时候调用页面声明周期onLoad: 页面加载的时候触发,参数是页面的 query 参数,每个页面只会触发一次onShow:每次页面展示的时候都会触发,包括返回上一页onReady:页面第一次触发 onShow 之后,并根据逻辑层数据完成了第一次渲染,此时触发 onReady。一个页面只有一次onHide:页面隐藏时触发,wx.navigateTo, tabB

2021-02-25 23:18:19 157 2

原创 小程序 step_7-常用API

App.onLaunch: 小程序装载完代码立即执行App.onShow:小程序处于前台的时候执行onLoad: 在 onLaunch 和 onShow 之间,只调用一次?getApp():获取应用实例canIUse(’’ "):是否可以使用wx.navigateTo({}): 跳转?wx.redirectTo: 跳转?wx.switchBar: 切换?this.setData:改变状态wx.getUserInfo: 获取用户信息button: open-type?getStorag.

2021-02-25 15:13:38 183

原创 小程序 step_5-npm

使用 npm 包安装包使用小程序开发者工具:工具—》构建 npm勾选使用 npm 模块构建完成之后即可使用 npm 包JS 模块包直接 require小程序组件库{ "usingComponents": { "myPackage": "packageName", "package-other": "packageName/other" }}为什么会有构建 npm 这一步?1.node_modules目录不会参与打包,编译,上传2.构建完毕后,在小程序根目

2021-02-25 14:31:24 56

原创 小程序 step_4-wxss和 js

wxss小程序样式分公共样式,页面样式,其他样式文件,其他样式文件用于被页面引用引用 wxss:@import ‘…/path’官方样式库:weUI。jsjavascript是ECMAScript的一种实现,不同的宿主环境可以有不同的实现方式。浏览器、node、native…小程序中的 js 同浏览器和 node 中的不同小程序中,ios9,10 运行环境下还没有完全兼容到 es6 的标准,所以小程序 IDE 提供了将 es6 代码转化为 es5 代码的功能,开发者需要在项目设置中,勾选

2021-02-25 11:59:52 106

原创 小程序-step_3-wxml

标签wxml 对大小写敏感wxml 具有数据绑定,可以将数据变化反应到页面上wxml 的属性值必须包含在双大括号中条件判断wx:if, wx:elif, wx:else条件逻辑要一次性判断多个标签是否需要展示,使用<block/>标签包裹列表渲染wx:for列表渲染,默认当前项下标 index,当前项的值为 itemwx:for-index重新制定下标名wx:for-item重新指定变量名9.wx-for 渲染多节点的结构块也可以使用 <block /&gt

2021-02-25 11:33:49 89

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除