zoukankan      html  css  js  c++  java
  • 总结

    你不知道的js
    
    1.switch() 中的是条件和case 判断是=== 全等判断
    2.break xxx;可以跳出一个代码块
    !function(){foo:try{return 10;}catch(e){}finally{console.log("xxx");break foo;console.log("yyy")}}()
    
    
    
    webpack-cli 依赖 webpack4.x.x
    webpack 的安装webpack-cli 必须是全局的,不然运行webpack 命令时会提示安装webpack-cli,但是提示的是-d模式,即使安装了再次运行webpack还是会提示你安装webpack-cli;
    配置文件 mode: development|production 表示编译模式
    output 的path 值必须是 绝对路径,使用path.resolve(__dirname)+想要的路径即可,__dirname 是当前文件的路径,path.resolve是用来构建绝对路径的
    在某个目录下执行webpack 就是默认 使用webpack.config.js 中的配置 调用webpack,也可以直接使用webpack api来调用
    webpack.config.js 
    const path = require("path");
    module.exports = {
    entry:"./src/main.js",
    output:{
    	filename:"[name].js",
    	path:path.resolve(__dirname, 'dist')
    
    },
    mode:"production"
    
    
    
    }
    package.json中 script可以加入
    "start":"webpack webpack.config.js"
    运行 npm  start 即可。其他的脚本需要使用 npm run xx
    
     
    
    node 目前不支持 import语法,但webpack打包的文件支持import,也支持import某个文件中的 单独的一项(但实际上整个文件都会先执行一遍,而且js文件也会全部引入)
    单纯使用 webpack 编译出来的 dev js的结构是:
    
    (function(modules){
      xxxx
    })({
    "模块名":function(){"use strict" eval(模块代码)}//模块名 就是 import 时的 名字
    })
    
    webpack编译出来的js如果含有es6代码是不会转换成ES5的,但是转换的文件中使用了 Object.defineProperty 导致ie9以下无法使用,ie9以下能使用,可以手动将Object.defineProperty转换一下(或者有其他配置)
    
    纯webpack 编译出来的 production 的js结构是
    !function(e)
    {}([function(){
    依次摆放各模块的js
    
    }])
    同样由于使用了Object.defineProperty 不支持ie9,还有使用了 xx.保留字 低版本ie也不支持
    
    在js中 import css文件 是在加载该js的时候,创建一个style 将css 放到style中,然后插入到页面中。需要在module中加入 style-loader ,css-loader
    
    module:{
        rules:[
    	{
    	test:/.css$/,//必须是正则
    	loader:["style-loader","css-loader"]  //style-loader要在前面
    	}
    	
    	]
    }
    
    
    
    引入css中引入图片必须使用 file-loader来处理,但是file-loader 处理后的图片 会直接和js放在同级目录下,会与css中的引用路径对不上
    
    loader 的加载顺序是从右向左的,babel preset也是先加载后面的,loader 可以在import 的时候指定,配置的时候指定,
    命令行中指定。
    plugin 是webpack的支柱,webpack 本身就时构建在它的插件系统上的
    
    引入vue-loader 和vue后就可以直接编译vue了
    vue-loader 15版本后要伴随 VueLoaderPlugin  在vue-loader/lib/plugin中 在plugin中使用 ,vue后就可以直接构建vue了
    
    注意vue 是在  import Vue from "vue/dist/vue.common.js" 中引入
    
    
    
    
    
    使用 vue-cli 构建的系统,在去掉babel 后无法编译,{...object} 语法,但是单独使用webpack 又可以编译
    
    new Vue ({})中使用 ...App,触发热替换会出错。热替换更改js,会刷新整个页面,更改css,和vue不会。猜测是css和vue是通过loader加载的 css没有经过loader
    webpack 4 和webpack 3 ,webpack4 把cli 分开了分成了webpack 和webpack-cli,webpack-clic要全局安装
    
    vue-loader 新版本需要 vue-loader/lib/plugin 需要这个插件
    
    npm run  会运行 package.json 中的script 命令。并且自动加上./node_module/bin路径,bin目录都是可执行的脚本
    
    ExtractTextWebpackPlugin 可以提前css ,但是目前不支持webpack4 可以使用bate版本 ExtractTextWebpackPlugin@next ,使用了这个插件就不要使用 style-loader 否则会报window is not deinfed
    webpack 3和 和webpack-devServer2 配,webpack4和webpack-devServer 3配
    
    
    
    gzip压缩可以大大压缩js,css的体积,至少会压缩一半。js匿名化压缩后再进行gzip压缩可以大大的减少体积
    
    
    chrome 自动填充功能开启后,当页面新增了input后,会再次填充一次,会导致如果填充的密码不对,无法修改的情况产生
    
    
    cssnano postcss 插件 uglifycss,uglify-js
    https://www.sohu.com/a/131380036_374240
    前台如何处理同时异步
    代码风格缩进
    
    
    cookie maxAge :0 表示不储存,即发送给客户端后该cookie立马会失效,不会再发送给服务器,客户端js也拿不到这个cookie
                    负数表示,浏览器关闭就不存在了(同一个浏览器的所有窗口都关闭)
    cookie domain 不设置 默认为当前域名,如果设置成和当前域名不同则不会写入cookie
     
    cookie path 不设置 默认为当前目录,如果设置不是当前path或父路径 则不会写入cookie 
    
    -g 表示全局安装,通常用于安装脚手架等工具
    –save(-s) 表示本地安装,会被加至dependencies部分
    –save-dev 表示本地安装,会被加至devDependencies部分
    什么都不加也会安装,但是不会加至package.json中
    
    npm install  会安装packeage.json 中的的devpendencies 和devDependencies
    npm install --protection 只会安装devpendencies中的文件
    
    package-lock 是锁定了插件版本的,保证下载的版本完全一样。
    whwier-lock.json 和 lock完全一样,不过wher-.lock可以发布
    require 一个文件名如果不是以 ./,../开头的 会直接从当前目录的 node_module中查找,然后在父目录的node_module中查找,直到根目录,最后还会查找(NODE_APTH/node_module,不建议配置,会导致一些问题),
    所以默认情况下,require是无法加载全局的package的,除非设置NODE_PATH环境变量
    
    .npmrc 可以修改npm 的设置 也可以使用命令 npm config set key value,可以设置包注册地址    npm config set registy xxx,临时使用可以用 npm install --registy xx
    cnpm 与npm相比已经完全无优势,可以弃用cnpm
    
    webview 可能不支持定时器
    webpack 打包时 plugin 会被打包进去
    
    
    组件上绑定原生事件 要使用  .native,否则 需要组件内部 调用 $emit("事件命")触发,例如:
    在  需要再myInput内部调用 $emit("click")才能触发
    
    
    ref 是父组件调用子组件的一个入口,在父组件中使用  $refs.name 来调用,$refs.name 是组件实例或者dom元素,如果改变$refs.xx的值,xx是响应式的更改,不懂官网上说的ref不是响应式的意思是,ref="xxx"这个xxx只能是字符串,且不可拼接
    
    iframe 内嵌的情况下,跨域情况下 如果iframe高度能展示全 点击锚点无法到对应的位置
    
    uri 统一资源标识符 重点是标识 url统一资源定位符,重点是定位
    每个url都是uri,url于uri的区别的url必须指明如何访问该资源,而uri无需执行
    encodeURI 只会编码空格
    encodeURIComponent 会编码任何特殊字符
    
    事件处理函数在jquery 中 return false == e.stopPropagation()和e.prevendDefaut(),  
    在原生的 事件处理函数中:return false 无效果
    新出一个 e.stopImmediatePropagation() = stopPropagation+用来阻止当前事件的其他处理函数  ie9+支持
    
    
    navigator.onLine 判断是否有网络,ie6+都支持,还有window online和offline事件
    
    weakSet和weakMap 弱set和弱map weakSet只能装引用类型,weakMap的key只能是引用类型,weakSet和weakMap的使用场景是可以被自动回收的对象如 dom节点。
    weakSet和weakMap是不遍历的,因为垃圾回收机制会不时的删除内部对象,所以遍历不合适。
    set和map是强引用,即使内部的数据被删除,也不回被垃圾回收机制回收
    
    
    generator.next()传参会传给上一个 yiel,generator.throw 会再 function*()内捕获,但是必须先调用一次next,generator.return 会终止迭代,且return的参数作为value返回值
    
    localStorage sessionStorage 在ie8支持,ie上必须是http方式的访问才能使用。localStorage 永远保存的,除非手动删除,localStorage同一个域名下的都可以访问,https://host:port 只要是该域名下的都可以访问。
    sessionStorage 是页面级别的,只对当前页面有效,浏览器关闭或者重新打开新的tal页无法共享,页面跳转后再后退回来仍可以取值。
    
    webview 无法获取标题,可以通过改标题后加载一个iframe 来让webview识别
    
    
    
    eventSource 前端创建一个 eventSource 对象监听 messge,error 事件
     var eventSource = new EventSource("/api")
          eventSource.addEventListener("message",function(data){
          	console.log(data);
          })
        eventSource.addEventListener("error",function(data){
          	console.log(data);
          })
    	 后端 处理api 请求时需要将 head:ContentType 设置为 'text/event-stream' 
    	   res一定要是write ,如果,send 就表示这个请求结束了,链接会断开,客户端会重新发请求
    	   数据格式是: “key:value 
    
    ”形式 
    
     发出去
    	   也可以指定 event,前端去监听该event res.write("event:get
    
    "),前端使用 eventSource.addEventListener("get",function(){})来监听,不指定默认用 message
    	   链接断开后会触发 error 事件,然后客户端会间隔3秒(chrome3秒)再次发请求
    	   res.setHeader('Content-Type', 'text/event-stream');
    	   setInterval(function(){
         	
           res.write("data: The server time is"+new Date()+"
    
    ");
    
         },5000);
    
    样式总结:
    fixed float absolute 会导元素无法自动填充页面,fixed 元素固定在顶部或底部会导页面部分元素被覆盖,一个办法就是第一个元素和最后一个元素
    写margin-top 或padding-top,margin-bottom,或padding-bottom来实现,第一个元素的margin-top会和父元素(无border-top或padding-top)的margin-top合并,表现为body出现margin-top
    fixed  absolute等脱离文档流的元素,不写left,right,top,bottom,会默认在为static的位置上,但是其他元素无感知,如果后面又其他元素会覆盖在其他元素上
    float 元素挤走相邻的inline ,inlin-block元素	,及挤走相邻包裹在block元素内的inline,inline-block元素
    float 相邻的是block元素时,float元素会浮在block上,实际上block元素还是占满一行的
    使用float 自适应时,写margin-left/right 要写在float元素上 使用autoprefixer 可以解决flex兼容问题,旧版的flex flex=1在原本是行内元素的标签(a,span)上太不生效,要改成div var browserList = ["> 0.00001%"]; const autoprefixer = require("autoprefixer")({ flexbox:true, browsers:browserList }) 一排inline元素里放字母,会被认为是一串单词,例如 <div><span>a</span>
    <span>a</span>
    <span>a</span>
    <span>a</span>
    <span>a</span>
    <span>a</span>
    </div> 如果不指定换行,span不会换行

    等高布局:负margin -bottom,right不会影响元素本身,只会影响他右或下的元素向它靠
    负 margin -top,left 会导致元素本身发生偏移
    1。负的 margin-bottom,加上正的等值 padding-bottom,父元素overflow hidden,父元素就会被子元素实际内容最高的撑高,只要,这个
    父边距足够大,就能完全实现等高布局
    2.使用flex 布局

    .babelrc 只是webpack 配合babel-loader 来回自动调用
    webpack import() 动态导入,在webpack3 时,引入stage-2 既可以解决报错,在webpack4 中使用插件@babel/plugin-syntax-dynamic-import 也可以解决报错,
    这两个并没有转换 import()语法,只是让babel能识别import(),
    不要使用 babel-plugin-dynamic-import-webpack 这会使 import() 被转换成require.ensure语法,这是一种倒退。
    webpack 转换的js 不兼容ie8,有诸多问题,如default,等关键字作为属性在ie8中是不允许的,所以打算用webpack 就不要考虑能兼容ie8了
    background-origin 是指背景图片的起始位置,背景色的起始位置不变
    backgroun-clip 是对背景进行裁剪,即隐藏掉部分,box-border box-padding box-content box-content 表示只保留content上的背景,其他背景都cut掉,不展示
    背景色的起始位置是border ,背景图片是padding

    word-wrap 和word-break word-wrap:break-word 如果放不下的另起一行,一个单词一行都放不下,就会被拆分开来,word-break:break-all,每行都占满,放不下的强行拆开
    resize:both 和overflow:auto 一起用才能显示用户拖动的

    事件委托 on 是将事件绑定在委托对象上,然后点击事件在委托对象上发生时,获取e.target,循环获取target的父元素判断是否有事件委托在对象上,从而达到先执行子元素绑定的事件,再执行父元素的事件

    据说老的浏览器上,click有延时,所以使用tap事件代替(tap事件就是判断,touchstart 和touchend 之间的时间间隔和触摸位置变化),但是tap事件有点透bug(比如,有个蒙尘tap就关闭,蒙尘下面是一个按钮,由于真正的click还在延时中 ,导致蒙尘下面的按钮会触发click),据说新版本已修复,终极解决方案是fastClick,

    但是:
    Android版Chrome 32+浏览器,如果设置viewport meta的值为width=device-width,这种情况下浏览器会马上出发点击事件,不会延迟300毫秒,

    所有版本的Android Chrome浏览器,如果设置viewport meta的值有user-scalable=no,浏览器也是会马上出发点击事件。

    实测 在网页中加入 <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" /> 不会有点击延时,如果不加入这一段就会有点击延时,大概300ms左右,

    现在一般网页都设置了viewport 所以不需要fastclick了,也不必关注300ms的延时

    safair 上也测试了,加上viewport不会有点击延时,不加viewport会有300ms的延时

    mouseover和mouseenter(不冒泡)

    pointer-event:none 就是不触发鼠标事件,其子元素也不触发。
    如果 pointer-event:none 的元素覆盖了一个兄弟元素,鼠标是可以点击到这个兄弟元素的

    moment 一款多语言展示日期库

    webpack.BannerPlugin 是在cunk中加注释的插件
    new webpack.BannerPlugin({
    "banner":"bannerplugintest"
    })

    webpack.ContextReplacementPlugin 是用来处理require(`../lang/${lang}.js`)这种不指定具体js的,它可以覆盖路径或者进行过滤、
    也可以处理 import(),require.ensure 不确定路径问题
    打包lang路径下的js时,只打包匹配 /zh/的
    new webpack.ContextReplacementPlugin(/lang/,/zh/)

    ClosureWebpackPlugin 是基于google closure tool 的js优化工具,不仅仅是对js的压缩功能还有语法分析去除不必要的代码


    不使用任何插件只有入口chunk,
    import("")或require.ensure 导入的是动态导入的会被 打包成一个单独的chunk 被称为子chunk
    cunkId默认是 按chunk数递增的,加入 NamedChunksPlugin 会将chunk用moudle名命名
    默认的moudldId 是 从0开始递增的,使用 namedMoudle 会将模块路径作为moudleid
    使用 HashedModuleIdsPlugin 会将文件的hash作为moudleid 用在生产环境会很好


    commonChunksPlugin
    {
    name: string, // or
    names: string[],
    // 这是 common chunk 的名称,如果这个chunk已经存在就会将common chunk和 该chunk内容打包到一起。
    // 如果一个字符串数组被传入,这相当于插件针对每个 chunk 名被多次调用,就相当于
    调用多个commonChunkPlugin
    例如:commonChunkPlugin({
    names:["test1","test2"]
    })
    等价于:
    commonChunckPlugin({
    name:"test1"
    }),
    commonChunkPlugin({
    name:"test2"
    })

    这里得看看commonChunkPlugin 源码

    多个commonChunkplugin时,第一个会提取出公共的模块,第二个会提取出wepack 的引导代码(一些辅助方法的定义,webpackJsonp...),mainifest
    最多定义两个commonChunkPLugin 只有第一个和最后一个生效


    // 如果该选项被忽略,同时 `options.async` 或者 `options.children` 被设置,所有的 chunk 都会被使用,
    // 否则 `options.filename` 会用于作为 chunk 名。
    // When using `options.async` to create common chunks from other async chunks you must specify an entry-point
    // chunk name here instead of omitting the `option.name`.

    filename: string,
    // common chunk 的文件名模板。可以包含与 `output.filename` 相同的占位符。
    // 如果被忽略,原本的文件名不会被修改(通常是 `output.filename` 或者 `output.chunkFilename`)。
    // This option is not permitted if you're using `options.async` as well, see below for more details.

    minChunks: number|Infinity|function(module, count) -> boolean,



    // 在传入 公共chunk(commons chunk) 之前所需要包含的最少数量的 chunks 。
    // 默认是数量必须大于等于2 且 等于 chunks的数量 才会将入口chunk中的模块提取出来,只有一个入口chunk不会提取模块,除非设置为1
    // 传入 `Infinity` 会马上生成公共chunk,但里面没有模块,只有webpack的辅助引导方法
    // 你可以传入一个 `function` ,以添加定制的逻辑
    传入1 的话,每个入口chunk中的模块都会被打包在一起

    chunks: string[],
    // 通过 chunk name 去选择从哪个chunk 中提取 commonchunk
    // 如果被忽略,所有的,所有的 入口chunk (entry chunk) 都会被选择。

    children: boolean,
    // 如果设置为 `true`,所有入口 chunk 的子模块都会被选择
    每个入口chunk的子chunk算一组,只提取每个入口文件中子chunk中的公共代码

    如果有两个入口chunk,app,vender,
    会分别提取出app中子chunk的公共代码
    vernder子chunk的公共代码,
    vender 和app 的子chunk相互不干扰 ,minkchuks 只会计算单个子chunk的


    所谓子模块就是 动态导入的模块,非动态导入的不算子模块,
    name

    deepChildren: boolean,
    // 如果设置为 `true`,所有公共 chunk 的后代模块都会被选择

    async: boolean|string, 如果是字串且有nameChunkIDPlugin ,生成的的fileName就是async的名字
    // 如果设置为 `true`,一个异步的 公共chunk 会作为 `options.name` 的子模块,和 `options.chunks` 的兄弟模块被创建。
    不可以与name并存,有name选项时 async不会有任何效果
    // 它会与 `options.chunks` 并行被加载。
    // Instead of using `option.filename`, it is possible to change the name of the output file by providing
    // the desired string here instead of `true`.

    minSize: number,
    // 在 公共chunk 被创建立之前,所有 公共模块 (common module) 的最少大小。
    单位是byte,如果公共chunk没有达到这个值,不会被提取出来
    }
    output.libary ,和output.libaryTarg可以代码打包成各中规范的代码 amd,cmd,commonjs或是直接在script中引用的
    可以供非node环境的代码使用

    webpack4 splitChunks 必须指定 chunks 才会分割

  • 相关阅读:
    GNU GPL介绍
    《Getting Started with WebRTC》第一章 WebRTC介绍
    进一步解 apt-get 的几个命令
    状态模式----C++实现
    boost库asio详解1——strand与io_service区别
    Timer.5
    Timer.4
    Timer.3
    MFC定时器
    boost.asio系列——Timer
  • 原文地址:https://www.cnblogs.com/chillaxyw/p/10841710.html
Copyright © 2011-2022 走看看