工作中的遇到的一些小知识 3
git case sensitive
git本身是大小写敏感的。但在大小写不敏感的系统里,需要用hack方法记录仅修改文件名大小写的改动。
1 | git mv file.txt temp.txt |
webpack的一些经验
DefinePlugin
允许创建一个在编译时可以配置的全局常量。在构建区分环境的包时很有用。
1 | new webpack.DefinePlugin({ |
注意:这个插件直接执行文本替换。因此:
- 如果这个值是一个字符串,它会被当作一个代码片段来使用。
- 如果这个值不是字符串,它会被转化为字符串(包括函数)。
- 如果这个值是一个对象,它所有的 key 会被同样的方式定义。
- 如果在一个 key 前面加了 typeof,它会被定义为 typeof 调用
resolve alias
创建import或require的别名,来确保模块引入变得更简单。例如,一些位于 src/ 文件夹下的常用模块:
1 | alias: { |
z-index可能的坑
使用前提:z-index只能在position属性值为relative或absolute或fixed的元素上有效。
z-index值只决定同一父元素中的同级子元素的堆叠顺序。父元素的z-index值(如果有)为子元素定义了堆叠顺序(css版堆叠“拼爹”)。向上追溯找不到含有z-index值的父元素的情况下,则可以视为自由的z-index元素,它可以与父元素的同级兄弟定位元素或其他自由的定位元素来比较z-index的值,决定其堆叠顺序。同级元素的z-index值如果相同,则堆叠顺序由元素在文档中的先后位置决定,后出现的会在上面。
git submodule
参考:GIT 子模块
最新一个项目里要复用已有的一个git库的代码,具体来说就是要将之前在WebView的内容复刻到PC版完成(这个需求貌似应该还挺常见的)。为了保证代码复用性,选择了git submodule
的方法。这也是我此前从没用过的一个命令。
简单来说,是一个 GIT 仓库下面某个文件夹的来源可以跟本库的来源不同,这个文件夹连接着别的库,由别的库负责按本控制和管理。是不是和npm包管理的形式比较像。子模块可以手动添加,也可以在克隆一个主库的时候就直接实体化。具体来说,有四种情况:
- 克隆库的时候要初始化子模块 => 加上
--recursive
参数git clone --recursive git@github.com:shenlvmeng/trace-maker.git
- 初始化已有库的子模块 =>
git submodule update --init --recursive
- 从子模块的源更新该子模块 =>
git submodule update --recursive --remote
- 添加一个新的子模块 =>
git submodule add <git address> <folder address>
已有有git submodule的库内,.gitmodules
是下面的样子:
1 | [submodule "wheel"] |
npm install
npm install后跟的绝不仅仅只是包名,还可以通过ssh、http的形式引入npm包,唯一的要求是有package.json
1 | npm install (with no args, in package dir) |
一个package可以是下面的形式:
- 包含
package.json
的工程文件夹 - gzip过的“1”的压缩包
- 指向“2”的url
- 发布在npm-registry的
<name>@<registry>
字符串 - 发布在npm-registry的
<name>@<tag>
字符串 - 发布在npm-registry的
<name>
字符串(最新版本) - 一个指向“1”的合法git地址
cleave.js
一个自动格式化输入框的工具,有npm包、script标签等几种引用形式,还有react的使用方式。
地址:Format your <input/> content when you are typing
object-fit & object-position
这两个CSS属性分别用于指定替换元素在其盒模型内的覆盖大小和对齐方式。使用效果很类似background-size
和background-position
。替换元素即内容不受CSS视觉格式化控制的元素,如image、iframe、video、textarea等。
这使得本来自己决定模型大小的元素可以受CSS控制决定位置排布和大小。在需要自适应元素大小的场景下很好用,比如用户头像展示等。
唯一的小小缺憾可能是IE11还不支持这两个属性,以及Edge只支持对<img>
使用。
移动端触摸默认行为优化
user-select: none
禁止用户选择-webkit-touch-callout: none
防止长按contextmenu弹出。类似的还有contextmenu
事件里的e.preventDefault()
-webkit-tap-highlight-color: transparent
删除可点击元素默认的黑影
上传进度条
利用xhr事件的onprogress事件。
1 | xhr.onprogress = function (e) { |
不显示滚动条
基于Webkit的浏览器,可以使用CSS的方式隐藏滚动条。
1 | &::-webkit-scrollbar { |
keyup无法prevent default
keyup fires after the default action.
keydown and keypress are where you can prevent the default.
If those aren’t stopped, then the default happens and keyup is fired.
来源:jquery - javascript prevent default for keyup - StackOverflow
mixin in react
版本16之前,可以用mixin特性。16之后使用高阶组件HOC + ES6 class语法实现。参考。
user-select
在Edge浏览器下的适配问题
设置user-select
为none
在Edge浏览器下会导致input无法输入内容。可以用下面的写法,避免对input
标签应用该属性。
1 | *:not(input) { |
参考:html - Can’t type in input field using Microsoft Edge and Safari - StackOverflow
浏览器跨tab通信
最近业务遇到了一个需求:同一浏览器上多tab用户信息同步的问题,所有这个域名下的需要强制一样的用户信息,避免困惑。
跨tab通信主流方案有两种:
- localStorage,利用window的
storage
事件,传递信息 - BroadcastChannel,新的API,通过
postMessage
和onMessage
完成双向通讯
1 | var bc = new BroadcastChannel('test_channel'); |
后者还未得到广泛支持,需要前者进行polyfill。
aos
Animation on scroll。michalsnik/aos at master · Animate on scroll library.元素滚动至中的CSS动画,适合实现官网、落地页等效果。
extract-text-webpack-plugin
抽出CSS/Less/Sass等样式作为单独文件,用于那些需要提前加载样式的页面。详细用法见github
坑:
- 不支持webpack4.x,报内部错误(2018/07/30) => 使用@next下载最新版
- 报错
Module build failed: ReferenceError: window is not defined
=> style-loader在extract-text-webpack-plugin中只做fallback项使用,见issue#503
常见调试技巧
- 代码中插入debugger可以在该位置触发断点调试
console.dir
可以打印对象结构,大多数情况和console.log
表现一致,在document等DOM元素上表现不同
react组件复用设计思路
- 当设计的组件为自闭型时,通过传入数据(不要传入功能)props的方式定制组件
- 当设计的组件在有些场景下需要外部传入功能才能完整时,使用继承的方式实现
- 在可以拆分出原子组件,且有此必要的时候,使用原子组件拼装业务组件
- HOC优于mixin