[1027] 如何在webpack/react环境中引入at.js
ichord/At.js#411
要在react中加jquery本就别扭 更何况加的是jquery插件
一时无法摆脱jq 只能注意解决摩擦之处
class EditorForm extends Component {
componentDidUpdate () {
const { members } = this.props
$('#editor').atwho({ at: '@', data: members })
}
}
// wrong
import $ from 'jquery'
import 'jquery.caret'
import 'at.js/dist/css/jquery.atwho.css'
import 'at.js'
// correct
import $ from 'jquery'
import 'jquery.caret'
import '../fork/jquery.atwho.css' // custom styles
import '../fork/jquery.atwho.js' // some fix
// ../fork/jquery.atwho.js
App.prototype.onKeydown = function(e) {
// ...
case KEY_CODE.SPACE:
// ...
if (view.highlighted()) {
e.preventDefault();
+ // fix: conflict with react EditorForm onKeyDown
+ // hitting enter also submits form
+ e.stopPropagation(); // added
view.choose(e);
} else {
view.hide(e);
}
}
// ...
Controller.prototype.lookUp = function(e) {
var query, wait;
+ // fix: composite `@`+ Chinese character
+ // TypeError: Cannot read property 'which' of undefined
+ // at EditableController.catchQuery (jquery.atwho.js?:727:12)
+ // at EditableController.Controller.lookUp
+ if (!e) return; // added
--
[1025] mac pkg script open应用 tmpdir竟不存在
初次open os.tmpdir=/private/tmp/PKInstallSandbox.XXXXXX/tmp/
但是已经或即将被销毁 注意确保创建
否则部分功能可能受影响 因为一般假定tmpdir必然存在
# scripts/postinstall
# touch "${TMPDIR}/.keep" # <-- 这句也无济于事
open '/Applications/Genius.app'
// × 甚至nwapp初始化时创建 也无法避免销毁
// main-0.js
// fs.ensureDirSync(os.tmpdir())
// √ 应该在具体调用时确保 很难做到
fs.ensureDirSync(dirname(file))
screencapture(file)
// √ 折中 我选择了重写tmpdir
// 并且需要养成一个好习惯 永远都是用到时才调tmpdir()
// 而不是长期缓存一个变量`dir = tmpdir()`
os.tmpdir = (fn => {
return function tmpdir () {
const dir = fn()
fs.ensureDirSync(dir)
return dir
}
})(::os.tmpdir)
--
[1020] 通配符过滤移除文件 小记
https://github.com/sindresorhus/del#beware
http://unix.stackexchange.com/questions/1168/how-to-glob-every-hidden-file-except-current-and-parent-directory
del基于globby,node-glob,minimatch
关于取反 **
匹配所有children以及parent 需要显示取反
关于隐藏文件 .*
*
分别匹配所有隐藏和非隐藏文件
// wrong
del([
`${crsa}/**`,
`!${crsa}/index.js`,
`!${crsa}/node_modules/bindings/**`,
`!${crsa}/build/Release/addon.node`,
])
// right
del([
`${crsa}/**/{*,.*}`,
`!${crsa}`,
`!${crsa}/index.js`,
`!${crsa}/node_modules`,
`!${crsa}/node_modules/bindings/**`,
`!${crsa}/build`,
`!${crsa}/build/Release`,
`!${crsa}/build/Release/addon.node`,
])
--
[1011] db迁移 数据分批导入
- 数据库加密win/mac
- 数据库/表依次迁移逻辑
- 数据库init/upgrade逻辑封装
- 记录迁移filter判断
- 单条插入语句拼接
- 记录分批量迁移
async function migrate (from, to, filter) {
// ...
for (let { name, sql } of tables) {
// ...
// 避免大小超出限制 数据分批导入
const pageSize = 1000
/* eslint-disable no-constant-condition */
for (let i = 0; true; i++) {
const rows = await t2p(cb => {
from.all(`SELECT * FROM "${name}"
${condition}
LIMIT ${pageSize}
OFFSET ${i * pageSize}`, cb)
})
if (rows.length <= 0) break
const row0 = rows[0]
const keys = rowKeys(row0)
const keyHolder = keys.join(',')
// 拼接成一条sql 速度快
const valuesHolder = rows.reduce((m, row) => {
const values = rowValues(keys, row)
return m.push('(' + values.map(escape).join(', ') + ')'), m
}, []).join(', ')
sql = `INSERT OR REPLACE INTO "${name}" (${keyHolder}) VALUES ${valuesHolder}`
await t2p(cb => to.run(sql, cb))
console.log(`migrated table ${name} rows * ${rows.length}`)
}
console.log(`migrated table ${name} finish`)
}
// ...
}