日常问题

2020/7/3 基础

# 1.cookie的域

目的:需要两个不同的域 共享cookie。(xdd.qwer.vip 和 ugg.xdd.qwer.vip 类似这样的)
背景:我在 xdd.qwer.vip 这个域下,获取并设置token,通过 location.href 跳转到 ugg.xdd.qwer.vip
发现 在之前域下设置的cookie竟然死活都获取不到, 通过搜索 发现问题是:

cookie的域是用来限制哪些域名能来访问cookie的, 解决同一个主域下的访问问题

项目中我设置cookie的方式是,通过 ‘js-cookie插件’ 实现的。

安装:

npm install js-cookie --save

引用:

import Cookies from 'js-cookie'

# 一般用法:

  • 设置:
// Create a cookie, valid across the entire site:
Cookies.set('name', 'value');

// Create a cookie that expires 7 days from now, valid across the entire site:
Cookies.set('name', 'value', { expires: 7 });

// Create an expiring cookie, valid to the path of the current page:
Cookies.set('name', 'value', { expires: 7, path: '' }); 
  • 获取:
// Read cookie:
Cookies.get('name'); // => 'value'
Cookies.get('nothing'); // => undefined

// Read all visible cookies:
Cookies.get(); // => { name: 'value' }
  • 删除:
// Delete cookie:
Cookies.remove('name');

// Delete a cookie valid to the path of the current page:
Cookies.set('name', 'value', { path: '' });
Cookies.remove('name'); // fail!
Cookies.remove('name', { path: '' }); // removed!

# 特殊用法:

跟一般使用不同的是,从Cookie中取出的时候,要从字符串转换成json格式:

const user = {
  name: 'lia',
  age: 18
}
Cookies.set('user', user)
const liaUser = JSON.parse(Cookies.get('user'))

在项目中我使用的设置及删除方法是:

Cookies.set( name, value);  // name 及 value均为动态
Cookies.remove('name'); 

发现不同域不能共享cookie的时候,做出以下修改

  return Cookies.set(key, value, { domain: 'qwer.vip' });
  return Cookies.remove(key, { path: '', domain: 'qwer.vip' });

# 2.本地写入cookie,chrom调试无反应

今天在项目中写入cookie时,一直没反应.原生js和插件都尝试了,可还是没有反应 结果发现!!! ,不要直接是file://这种格式的打开文件


这种就是不对的,将文件放到服务器上运行!
当然还有另一种方法,本地的话chrome不行,用其他浏览器调试吧。我用了火狐,一切ok,最后推测,chorm也ok。

# 3.npm安装模块遇到ENOENT: no such file or directory, rename错误

  • 在做scratch 3.0二次开发,在scratch-vm文件夹下进行npm link 的环节中,一直在报这个错误
  • 找了很多地方,感觉这个是最靠谱的,
  • 删除了项目中的package-lock.json 之后就真的没有报过了,

# 4.npm安装模块遇到ENOENT: no such file or directory, access错误


path /Users/xudier/wecode/bfe_react_scratch/scratch-vm/node_modules/_@babel_highlight@7.10.4@@babel/highlight/node_modules/js-tokens
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall access
npm ERR! enoent ENOENT: no such file or directory, access '/Users/xudier/wecode/bfe_react_scratch/scratch-vm/node_modules/_@babel_highlight@7.10.4@@babel/highlight/node_modules/js-tokens'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent 

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/xudier/.npm/_logs/2020-07-03T06_16_23_041Z-debug.log
  • 大部分类似与这种的问题,我们可以首先找到关键字,看看他是node_modules下面的哪个包找不到
  • 代码中所示js-tokens,是这个,于是乎我们可以来到这个网站
  • 找到后通过命令下载,我一般会用cnpm,npm经常会报错。
  • 再重新执行那个会报错的命令,可以看看问题有没有解决

# 5.vue在生产环境清除console.log

在cli还是2.xx 版本的时候,我们可以这样

  • 1.npm/cnpm 下载
 cnpm uglifyjs-webpack-plugin --save-dev
  • 2.在build/webpack.prod.conf.js文件下,在webpackConfig中plugins数组中进行配置
plugins: [
  new UglifyJsPlugin({
    uglifyOptions: {
      compress: {
        warnings: false,
        drop_console: true,
        pure_funcs: ['console.log']
      },
      mangle: {
        safari10: true
      }
    },
    sourceMap: config.build.productionSourceMap,
    parallel: true
  }),
]

如果cli是3.xx几版本的,可以尝试这个

# 6.系统可能不会保存你所做的修改 onbeforeunload

// 监听页面关闭
window.addEventListener('beforeunload', (e) => {
    let changeSymbol = false
    if(changeSymbol) {
      return (e.returnValue = '有信息未保存,确认离开?!'); 
    }
    // return null; // 不会弹框
    // return true // 会弹框
})

像上述情况,只要将changeSymbol改为true,那么return的内容必为true,也就会弹框。

用胳膊当枕头
최낙타