怎么调试Webpack+React项目,报错basedir=$(dirname “$(echo “$0″ | sed -e ‘s,\\,/,g’)”)怎么办

今天在WebStorm上Windows上准备调试一个React项目,就出现了这样的报错。 Node Parameters里面写的是webpack-dev-server的执行文件.\node_modules\.bin\webpack-dev-server.cmd,用的是相对当前工作空间Working directory的相对路径。 basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") ^^^^^^^ SyntaxError:missing ) after argument list 之前一直在Mac都是类似这么写的,怎么会报错呢? 在Mac上不存在这样的问题 只能换一个思路试试了,我们执行npm instal –save-dev webpack-dev-server时是会在node_modules文件夹创建两个东西的 node_modules文件夹里面会有webpack-dev-server文件夹 node_modules文件夹的.bin文件夹里面会有webpack-dev-server执行文件 .bin文件里面的执行文件最终还是会执行其对应node_modules文件里面的webpack-dev-server文件内容的,可以查看此执行文件得知这一点。 其实执行 ./node_modules/.bin/webpack-dev-server.cmd 其实就是执行/node_modules/webpack-dev-server/bin/webpack-dev-server.js 之所以在Windows上报错,我想是因为Windows不支持shell脚本语句所导致,而Mac上支持shell脚本 一开始提到的报错也是显示是这个文件报错了,既然如此,我们为什么不试试直接执行node_modules/webpack-dev-server里面的文件呢? 将Node Parameters里面写成.\node_modules\webpack-dev-server\bin\webpack-dev-server.js可以成功调试了。 简单总结下 webpack本质也是JavaScript项目,我们同样可以使用类似node xxx.js的方式来运行和调试webpack。 我们安装在package.json的’devDependencies’里面的依赖包有两种运行方式: 使用快捷方式: ./node_modules/.bin/webpack-dev-server.cmd 使用完整路径方式: .\node_modules\webpack-dev-server\bin\webpack-dev-server.js PS: 开发童鞋喜欢用Mac,并不是为了装X,Mac的类unix的命令行就是很爽,少一堆问题。

React router用hooks读取routeName、根据routeName跳转

在迁移Vue至React的过程中遇到了一些路由相关的问题,在Vue项目中经常会使用routeName,毕竟使用path太长了,也记不住,我自己看了看React router也没有发现routeName相关的信息,可能是我没有找到,或者React没有这个概念吧。 在Vue中这样的写法比较常见 const router = new Router({ routes: [{ path: '/smart-mail', name: 'SmartMailBox', redirect: '/smart-mail/no-mail', component: SmartMailBox, children: [{ path: 'new/:ts', name: 'MailNew', component: smartMailNew, }, { path: 'info', name: 'MailDetail', component: smartMailInfo, children: [{ path: 'view/:uid/:ts', name: 'MailView', component: smartMailView, }, { path: 'reply/:uid/:ts', name: 'MailReply', component: smartMailReply, Read more…

邮箱收件人组件成长历程(三)跨栏拖拽不同数据方案对比

前几天写了收件人组件,它实际就是一个既能输入搜索又能标签形式展示的组件,我称它为SmartInputSelect(以下简称sis组件),在实现下列需求时遇到了些问题,需求就是想实现多个sis组件的邮箱地址能够相互拖拽,效果类似剪切操作。比如从sis_a中的邮箱地址拖拽到sis_b中,同时需要sis_a中的那个会被移除。 下面是具体的代码实现,每行的具体作用已经有注释了。 将拖拽数组逻辑简单写成了一个hook // hooks.js import React from 'react'; // 修改版useReducer export function useDispatch (initialState) { const [state, dispatch] = useReducer((state, action) => { return { …state, …action, } }, initialState); const modifyStateWhileDispatch = (payload, value) => { if (toString.call(payload) !== '[object Object]') { payload = { [payload]: value, } Read more…

wordpress博客提示“Briefly unavailable for scheduled maintenance. Check back in a minute”

所谓“Briefly unavailable for scheduled maintenance. Check back in a minute”翻译过来就是“正在执行例行维护,请一分钟后回来”,这个问题一般出现在我们升级wordpress博客或者插件期间,有人访问,网址给予了这个提示,但是有时候不巧的是我们正在升级,然后因为网络等其它原因,升级失败了,我们只能刷新,然后我们作为网站的管理员,我们自己也收到了这个提示,无法继续之前被打断的升级过程,是不是很懵逼。。。 wordpress在升级的时候会有一个类似于加锁的过程,实际上就是在正式升级前在网站根目录生成一个.maintenance 的文件,待升级完成后再删掉.maintenance 文件,只要访问博客的时候检测根目录有.maintenance 文件就会提示“Briefly unavailable for scheduled maintenance. Check back in a minute”,没有即可正常访问。如果我们需要手动解除这个“锁”的状态的话,我们就需要自己手动删除根目录的.maintenance 文件。 怎么删除.maintenance 文件。 以.开头的文件一般在操作系统中是隐藏文件。 我们如果是用linux命令行的话,我们需要执行ls -a就能看到该文件了,我们rm -rf .maintenance即可将其删除了。 Windows上我们需要改下设置,让隐藏文件显示出来后再将其删除。

邮箱收件人组件成长历程(二)(React hooks升级版)

记得自己之前写过一篇《邮箱收件人组件(vue版)成长历程(一)》记得当时里面写到了自己使用的是可编辑div来进行输入的,同时提到当时出于挑战自己和青铜的倔强,想试着换个方案,完全使用可编辑div来实现。。。这个小小的倔强为后续很多功能瓶颈埋下了隐患。。。 使用contenteditable的div缺点 具体的隐患是什么的? 因为方案中采用的点击插入新收件人时实际上就是向数组里面插入一个空收件人对象,为了确保用户在胡乱点击时永远保证只有一个空对象,就需要频繁的做是否有多余空对象的检查。这个会导致数组频繁的重新渲染,鼠标点入进行选中元素变得很困难。 普通用户、产品和设计师一般会认为这个收件人组件是一个输入框(你见过谁家的输入框里面能展示校验成功与否的图标的),这会导致他们的需求和改版是以input的某些特性来设计的,这会部分场景用contenteditable的div无法实现,比如用户聚焦后改变整个组件背景颜色。 这次赶上项目迁移至React,对这部分也做了设计上的调整,改用主流的input方法来做输入和编辑态。 响应点击部分还是跟之前一样 代码结构 全局只有一个input,解决上述频繁去空检查的问题,将input的输入内容和数组中的某个index进行关联,该index位置就是input内容后续的插入位置,index后面的内容自然向后移动一位。需要编辑或插入内容时,移动input至对应的index。 在整个组件内但是非已存在收件人信息以外的区域(上图中的蓝框区域)点击时,认为是在最后面添加新的收件人,让input直接移动在列表的最后面,它的输入值会关联到当前收件人数组list的最后一个,关联index为list.length。 点击到某个收件人预览态(图中的绿框)时将其高亮,如果是双击的化则将其置为编辑态(将input移动到当前收件人位置,并将其数据从list中删除,关联input与该收件人index,待输入完成后再插回此index位置);如果是单击它前面(第一个小箭头所指区域),则是将input移动到它前面,关联input与该收件人index,带输入完成后,将新增内容插入该index。 代码片段: 在变更list数据后React会重新渲染,根据上述代码结构,input会重新出现在列表的最后面,我们需要待渲染完毕后通过图中的ref移动input到它需要出现的位置。 // 回车上屏插入数据 function onInputEnterInsert(data) { const result = getAutoCompleteResult(); // 当前是否选中了搜索候选词 const finalData = result.value ? result : data; // 如果有候选信息,直接插入候选信息,无视输入信息 insertData(finalData); afterDataInserted(state.inputIndex); } 插入数据过程 // 在列表中插入数据 function insertData(data) { const dataInfo = { …data, _addedTime: Date.now(), Read more…

Mysql报错“this is incompatible with sql_mode=only_full_group_by”

由于本站使用的是msyql8.x版本的mysql数据库,版本较高,发现网站的“月份存档”的数据不展示了,经过排查发现是接口未能如期返回的数据,而是出现了报错“this is incompatible with sql_mode=only_full_group_by”,显然是自己的sql语句里面有group_by,出现了兼容性问题。 我先进Mysql里面执行select @@GLOBAL.sql_mode;来查询下 我们可以这样解决这个问题 方法一:命令解决 执行命令: set @@GLOBAL.sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION; 缺点:此种方式的修改,在mysql 重启后就会失效。 方法二:修改配置文件my.cnf 一般路径是 /etc/my.cnf,有的可能是推荐在/etc/my.cnf.d/这样的文件夹里面修改对应的*.cnf文件,这得看/etc/my.cnf里面配置。 通过在配置文件里面手动添加sql_mode的方式强制指定不需要ONLY_FULL_GROUP_BY属性, 在 [mysqld] 下面添加代码: sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION 验证 重启mysql,再次执行查询命令select @@GLOBAL.sql_mode;

Vue和React hooks实现Select批量选择、选中条数、全选、反选实现对比

批量选择、全选、反选这些功能使用频率还是很高的,下面直接看看Vue和React分别怎么实现吧。 Vue 在使用Vue的时候是很容易实现的,我们以下列数据格式为例: const dataList = [{ id: 1, label: '第一个', }, { id: 2, label: '第二个', }, { id: 3, label: '第三个', }] 批量选择 在Vue中我们一般喜欢格外增加一个属性来标记是否已被选择,可以在每条数据item被勾选时,比如第一条的话就是Vue.set(dataList[0], 'checked', !!dataList[0].checked); 选中条数 const count = dataList.filter(item => item.checked).length; 全选 dataList.forEach(item => Vue.set(item, 'checked', true)); 反选 dataList.forEach(item => Vue.set(item, 'checked', false)); React实现一 在React中怎么实现呢? 如果只是简单按照同样的方式的话,你就会失望了。 Read more…

网址改用七牛云存储图片

本站上传的图片不多,但是为了以后的站点扩展,鉴于七牛云现在每月还有免费流量,最终决定迁移到七牛云去,并准备删除vps里面的图片了。 免费真香! 迁移步骤 将网址的历史图片上传至七牛云 这个最好是用官方工具来进行 七牛云官方的数据迁移工具将历史图片迁移到了七牛云内。 比如我用的是mac版的kodoimport,使用的是local模式,修改 kodoimport_macOS_64_v1.2.1/conf/local/single-mode/kodoimport.conf如下 { "debug_level": 0, # 日志级别 "bind_host": "0.0.0.0:8001", #【调度器】运行地址 #########不同任务需要修改内容######### "dst_bucket": "daozhao", # 【调度器】目标存储桶 "dst_access_key": "your_dst_access_key", # 【调度器】目标存储桶用户ak "dst_secret_key": "your_dst_secret_key", # 【调度器】目标存储桶用户sk "dst_prefix": "", #【调度器】目标前缀,默认为空,直接放在目标bucket下。一个本地文件路径为srcPrefix+[文件名]的文件,迁移到qiniu的object名称为dstPrefix+[文件名] "insert_only": true, # 【调度器】如果目标文件存在,是否覆盖,默认覆盖 "src_type": "local", # 【调度器】支持不同同步源类型,注意大小写,当前仅支持http,qiniu,oss,S3,local "work_dirs": ["./works1"], # 【调度器】工作目录,目录下将包含任务持久化信息,任务运行前需要创建好;任务开始后结束前不要手动修改 "src_objects_count": 27, #【调度器】目录下文件个数,如果与实际有偏差,进度比例信息会不准确,不影响迁移功能,不可为0 "src_prefix":"/Users/shadow/Pictures/", #【调度器】如果srcType设置为local,则填写本地目录,需要完整路径,以单个正斜线(/)结尾,不支持本地路径下的软连接 "ignore_dir": Read more…

vue迁移react使用useReducer hooks还想支持回调?

鉴于目前有个任务是把手上的vue项目迁移到react,为了尽可能的降低期间造成的功能缺陷,很自然的就会想到使用一个方法一个方法的迁移,有的场景在vue中很自然,在react中,尤其是在使用react hooks时,有的过程就不好弄,我就毕竟苦于在react hooks中没有class组件里面的setState的回调函数,导致后面的取值拿不到最新的state。 比如下面的例子。 In vue export default { name: 'VueComponent', data() { return { a: 'a', b: 'b', }; }, mounted() { console.log('result', this.funA()); // 1221–b }, methods: { funA() { this.a = '1221'; this.funB(); return this.funC(); }, funB() { this.a = this.a + '–'; }, funC() { return Read more…