1. Project Overview & Quickstart (crimx/LICENSE)
LICENSE
Open-source repository crimx/LICENSE
Repository Details
- Repository: crimx/LICENSE
- Primary Language: Code
Note: High-volume repository documentation is actively indexed and synchronized by YakaAI.
2. Official Technical Reference & Guides (crimx/crimx.github.io)
File: README.md
crimx.github.io
My site
Build Setup
# install dependencies
$ yarn install
# serve with hot reload at localhost:3000
$ yarn run dev
# build for production and launch server
$ yarn run build
$ yarn start
# generate static project
$ yarn run generateFor detailed explanation on how things work, checkout Nuxt.js docs.
File: package.json
{
"name": "crimx.github.io",
"version": "1.0.0",
"description": "CRIMX personal site.",
"author": "CRIMX",
"private": true,
"scripts": {
"dev": "nuxt --hostname 0.0.0.0",
"build": "nuxt build",
"start": "nuxt start",
"generate": "nuxt generate",
"deploy": "node scripts/deploy.js",
"ship": "yarn generate && yarn deploy",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
"precommit": "yarn lint"
},
"dependencies": {
"cross-env": "^5.2.0",
"normalize-scss": "^7.0.1",
"nuxt": "^2.0.0",
"nuxt-i18n": "^5.4.4",
"sass": "^1.41.1"
},
"devDependencies": {
"babel-eslint": "^8.2.1",
"eslint": "^5.0.1",
"eslint-config-prettier": "^3.1.0",
"eslint-loader": "^2.0.0",
"eslint-plugin-prettier": "2.6.2",
"eslint-plugin-vue": "^4.0.0",
"html-loader": "^0.5.5",
"markdown-loader": "^4.0.0",
"nodemon": "^1.11.0",
"prettier": "1.14.3",
"sass-loader": "^7.1.0",
"shelljs": "^0.8.3"
}
}
File: assets/stacks.json
{
"antd": ["antd", "https://github.com/ant-design/ant-design/", "Ant Design"],
"bulma": ["bulma", "https://github.com/jgthms/bulma/", "Bulma"],
"codepen": ["codepen", "https://codepen.io/", "CodePen"],
"dexie": ["dexie", "https://github.com/dfahlander/Dexie.js", "Dexie(IndexedDB)"],
"gatsby": ["gatsby", "https://www.gatsbyjs.org/", "Gatsby"],
"github-api": ["github", "https://developer.github.com/", "Github APIs"],
"graphql": ["graphql", "https://graphql.org/", "GraphQL"],
"hexo": ["hexo", "https://hexo.io", "Hexo"],
"i18next": ["i18next", "https://github.com/i18next/i18next", "I18next"],
"iview": ["iview", "https://www.iviewui.com/", "IView"],
"lerna": ["lerna", "https://lerna.js.org/", "Lerna"],
"netlify": ["netlify", "https://www.netlify.com/", "Netlify"],
"netlifycms": ["netlifycms", "https://www.netlifycms.org/", "Netlify CMS"],
"neutrino": ["neutrino", "https://neutrinojs.org", "Neutrino"],
"nuxt": ["nuxt", "https://github.com/nuxt/nuxt.js", "NUXT"],
"nuxt-i18n": ["nuxt", "https://github.com/nuxt-community/nuxt-i18n", "Nuxt-i18n"],
"observable-hooks": ["observable-hooks", "https://github.com/crimx/observable-hooks", "Observable Hooks"],
"postcss": ["postcss", "https://github.com/postcss/postcss", "PostCSS"],
"react": ["react", "https://github.com/facebook/react/", "React.js"],
"redux": ["redux", "https://github.com/reactjs/redux", "Redux"],
"redux-thunk": ["redux", "https://github.com/reduxjs/redux-thunk", "Redux Thunk"],
"redux-observable": ["redux-observable", "https://redux-observable.js.org/", "Redux Observable"],
"rxjs": ["rxjs", "https://github.com/ReactiveX/rxjs", "RxJS"],
"sass": ["sass", "https://sass-lang.com/", "Sass"],
"storybook": ["storybook", "https://storybook.js.org/", "Storybook"],
"typescript": ["typescript", "https://www.typescriptlang.org/", "TypeScript"],
"vanilla-js": ["javascript", "http: //vanilla-js.com/", "VanillaJS"],
"vue": ["vue", "https://github.com/vuejs/vue", "Vue.js"],
"vue-i18n": ["vue", "https://github.com/kazupon/vue-i18n", "Vue-i18n"],
"vue-router": ["vue", "https://github.com/vuejs/vue-router", "Vue-router"],
"vue-ssr": ["vue", "https://ssr.vuejs.org/", "Vue SSR"],
"vuex": ["vue", "https://vuex.vuejs.org/", "Vuex"],
"webpack": ["webpack", "https://webpack.js.org", "Webpack"]
}
File: projects/blog-2019/en-US.md
A technical blog following JAMstack architecture, based on GatsbyJS, a React Framework using GraphQL to manage resources. Post contents are managed on Netlify CMS. The whole site is delivered via Netlify network.
This is also an attempt to replace Class components with React Hooks, which brings great convenience and pleasant development experience.
Managing data and resources with GraphQL is also powerful and dead easy.
With Netlify CMS and Utterances, post files and comments are stored back to Github which reduces the dependency of third-party services.
Site logo are designed with illustrator. Social media icons are taken from NViconsLib 2, edited with Boxy SVG, merged with IcoMoon and compressed with SVGOMG.
File: projects/blog-2019/meta.json
{
"title": {
"zh-CN": "CRIMX BLOG",
"en-US": "CRIMX BLOG"
},
"url": "https://blog.crimx.com",
"stack": [
"gatsby",
"graphql",
"react",
"bulma",
"sass",
"netlifycms",
"netlify"
],
"badges": {
"github": "crimx/blog-2019"
},
"hideExpand": false
}
File: projects/blog-2019/zh-CN.md
ไธไธชๅบไบ JAMstack ๆถๆ็ๆๆฏๅๅฎขใๅฉ็จ React ๆกๆถ GatsbyJS ๆญ้ GraphQL ๅผๅ๏ผไฝฟ็จ Netlify CMS ็ฎก็ๆ็ซ ๅ ๅฎนๅนถๆ็ฎกๅจ Netlify ๅนณๅฐไธใ
ๅ ทไฝๆดๆขๅๅ ่งๅๆใไธบไปไน้ Gatsbyใใ
ๅฉ็จ GraphQL ็ปไธ็ฎก็ไฟกๆฏๅ่ตๆบไธบๅผๅๅธฆๆฅไบๆๅคง็ไพฟๅฉใ
Netlify CMS ๅ Utterances ๅฎ็ฐไบๆ็ซ ๅ่ฏ่ฎบๆฐๆฎ้ฝไฟๅญๅ Github ไธ๏ผๅๅฐไบ็ฌฌไธๆนๆๅก็ไพ่ตใ
ๆ ทๅผๅบไบไธไธช็ฐไปฃ CSS ๆกๆถ Bulma๏ผ Sass ๆจกๅ็่ฎพ่ฎกๅ้ดไบ ITCSS ๆๆณใ
LOGO ๅพๆ ไฝฟ็จ illustrator ่ฎพ่ฎก๏ผ็คพไบคๅพๆก้็จ NViconsLib 2 ๏ผไฝฟ็จ Boxy SVG ๆๅทฅ็ผ่พ๏ผๅฉ็จ IcoMoon ๅๅนถไปฅๅ SVGOMG ๅ็ผฉใ
File: projects/empty-module-loader/en-US.md
A webpack loader that replaces module with empty function which can be eliminated with Webpack Tree Shaking.
File: projects/empty-module-loader/meta.json
{
"title": {
"zh-CN": "Empty Module Loader",
"en-US": "Empty Module Loader"
},
"url": "https://github.com/crimx/empty-module-loader",
"stack": [
"webpack"
],
"badges": {
"npm": "empty-module-loader"
},
"hideExpand": true
}
File: projects/empty-module-loader/zh-CN.md
ไธไธชๅฏไปฅๅฐ็นๅฎๆจกๅๆฟๆขไธบ็ฉบๅฝๆฐ็ webpack loader ใ้ ๅ Tree Shaking ๅฏๅจ็ๆ็ไปฃ็ ไธญๅฎๅ จๆธ ้คใ
File: projects/ext-github-release-notifier/en-US.md
Chrome / Firefox extension for watching Github releases.
Unofficial "polyfill" for watching Github releases. It was based on this lovely idea. A year later Github finally added basic official support.
It uses Github APIs and takes advantage of 304 cache.
File: projects/ext-github-release-notifier/meta.json
{
"title": {
"zh-CN": "Release Notifier for Github",
"en-US": "Release Notifier for Github"
},
"url": "https://github.com/crimx/ext-github-release-notifier",
"stack": [
"vue",
"github-api"
],
"badges": {
"github": "crimx/ext-github-release-notifier",
"chrome": "gjhmlndokehcbkaockjlgeofgkiaiflg",
"firefox": "release-notifier-for-github"
},
"hideExpand": false
}
File: projects/ext-github-release-notifier/zh-CN.md
ไธๆฌพๅฏไปฅๆ majorใminor ๅ patch ็ๆฌๆฅ่ฎข้ Github release ็ Chrome / Firefox ๆฉๅฑใ
็ตๆๆบไบไธไธช issue ็่ฎจ่ฎบใไธๅนดๅ Github ็ปไบๆจๅบไบๅๆญฅ็ๅฎๆนๆฏๆใ
่ฏทๆฑๅฉ็จ E-Tags 304 ๏ผNot Modified๏ผ่ทณ่ฝฌๆฅๅฟซ้ๆฅ่ฏขใ
File: projects/get-selection-more/en-US.md
Get text and context (sentence, paragraph...) from window.getSelection().
File: projects/get-selection-more/meta.json
{
"title": {
"zh-CN": "Get Selection More",
"en-US": "Get Selection More"
},
"url": "https://github.com/crimx/get-selection-more",
"stack": ["typescript"],
"badges": {
"github": "crimx/get-selection-more",
"npm": "get-selection-more"
},
"hideExpand": true
}
File: projects/get-selection-more/zh-CN.md
ไป window.getSelection() ่ทๅ้ๅญไปฅๅไธไธๆ๏ผๆๅจๅฅๅญใๆฎต่ฝ็ญ๏ผใ
File: projects/hexo-filter-github-emojis/en-US.md
A Hexo plugin that adds emoji support, using Github Emojis API.
With accessibility in mind, this plugin generates unicodes for emojis then makes the font transparent and displays emoji images with background-image.
File: projects/hexo-filter-github-emojis/meta.json
{
"title": {
"zh-CN": "Hexo Filter Github Emojis",
"en-US": "Hexo Filter Github Emojis"
},
"url": "https://github.com/crimx/hexo-filter-github-emojis",
"stack": [
"hexo",
"github-api"
],
"badges": {
"github": "crimx/hexo-filter-github-emojis",
"npm": "hexo-filter-github-emojis"
},
"hideExpand": false
}
File: projects/hexo-filter-github-emojis/zh-CN.md
Hexo ๆไปถ๏ผๅฉ็จ Github Emojis API ๆฏๆๅจ Markdown ๅ HTML ๆจกๆฟไธญๆทปๅ ่ฏญไนๅ็ emojis ใ
่่ๅฐๅฏ่ฎฟ้ฎๆง๏ผๆฌๆไปถไผ็ๆ emoji ็ unicode ๅนถๅฐๅญไฝ่ฎพไธบ้ๆ๏ผ็ถๅๅจ่ๆฏๅพ็ไธญๆทปๅ Github emoji ๅพ็ใๅฝๅ ่ฝฝๅคฑ่ดฅๆถๆขๅคๅญไฝ้ข่ฒใ
ๆไปถๅๆถๆไพไธฐๅฏ็้ ็ฝฎ้้กน๏ผๆปก่ถณๅ็งไธๅ็้ๆฑใ
File: projects/javascript30/en-US.md
30-day vanilla JS coding challenge. Inspired by Wes Bos's JavaScript 30.
Some of my interesting ideas:
- Day 4 Queue*2 = Stack: Visualized stack based on two queues.
- Day 7 Stack*2 = Queue: Visualized queue based on two stacks.
- Day 19 Webcam Fun: With canvas transformation.
- Day 20 Levitation Charm: Native Speech Recognition.
- Day 23 Country Flags Game: With Speech Synthesis.
- Day 27 Jelly Pickle: handwritten spring algorithm.
- Day 29 Digital Clock: CSS transform clock. And a updated version - a counter based on Recompose and RxJS.
File: projects/javascript30/meta.json
{
"title": {
"zh-CN": "JavaScript 30",
"en-US": "JavaScript 30"
},
"url": "https://codepen.io/collection/DNdQZw/",
"stack": [
"codepen",
"vanilla-js"
],
"badges": {},
"hideExpand": false
}
File: projects/javascript30/zh-CN.md
ไธๅๅคฉๆฏๅคฉ็จ็บฏ JavaScript ใCSS ๅ HTML ๅไธชๅฐไธ่ฅฟ๏ผๅนถๅฐ้ฒไธไบๆฐ็ๆต่งๅจ API ใ็ตๆๆฅ่ชไบ Wes Bos ็ JavaScript 30 ใไป็ไพๅญ็ธๅฏน็ฎๅ๏ผๆๆ นๆฎ่ชๅทฑ็่ฝๅๅฎ็ฐไบไบๆดๅคๆ็็นๅญใ
ๆฏ่พๆๆๆ็ๅฆ
- Day 4 Queue*2 = Stack ๅฏ่งๅไธคไธช้ๅๅฎ็ฐไธไธชๆ ใ
- Day 7 Stack*2 = Queue ๅฏ่งๅไธคไธชๆ ๅฎ็ฐไธไธช้ๅใ
- Day 19 Webcam Fun ๅฉ็จ canvas ๅๆขๆๅๅคดๆฐๆฎใ
- Day 20 Levitation Charm ้บฆๅ ้ฃ่ฏๅซๆฌๆตฎๅใ
- Day 23 Country Flags Game ๅบไบ่ฏญ้ณๅๆ็็ๅฝๆๆธธๆใ
- Day 27 Jelly Pickle ๆๅ spring ็ฎๆณๅฎ็ฐ Q ๅผน่ ้ป็ใ
- Day 29 Digital Clock ๅบไบ CSS ๅๆข็ๆถ้๏ผไปฅๅๅ็บง็ๅบไบ Recompose ๅ RxJS ็่ฎกๆถๅจใ
File: projects/leetmark/en-US.md
A Chrome extension that can generate a decent Github Flavored Markdown template from a Leetcode problem page.
Meta data is stored as Front Matter from which Github will generate a neat data table.
File: projects/leetmark/meta.json
{
"title": {
"zh-CN": "Leetmark",
"en-US": "Leetmark"
},
"url": "https://github.com/crimx/crx-leetmark",
"stack": [
"vanilla-js"
],
"badges": {
"chrome": "pbpcnaodgahdlijbhjeohbjoafbdafdp"
},
"hideExpand": true
}
File: projects/leetmark/zh-CN.md
ไธๆฌพๅฏไปฅๅฐ Leetcode ้ข็ฎ่ฝฌๆขไธบ Markdown ็ Chrome ๆฉๅฑใ้ข็ฎๅ ๆฐๆฎ่ขซไฟๅญไธบ Front Matter ๆ ผๅผใ
File: projects/neutrino-webextension/en-US.md
Neutrino 9 preset for WebExtension development with hot reload and framework devtools.
Zero upfront configuration necessary to start developing and building a WebExtension.
Run development mode in a fake WebExtension environment which supports hot reload and framework devtools.
Webpack chunks are translated into manifest configs nicely.
Outputs are bundled for each browser respectively, with different manifest.
Works well with other official Neutrino presets.
File: projects/neutrino-webextension/meta.json
{
"title": {
"zh-CN": "Neutrino WebExtension",
"en-US": "Neutrino WebExtension"
},
"url": "https://github.com/crimx/neutrino-webextension",
"stack": ["neutrino", "webpack"],
"badges": {
"github": "crimx/neutrino-webextension"
},
"hideExpand": false
}
File: projects/neutrino-webextension/zh-CN.md
Neutrino 9 ่ๆๆถๆไปถ๏ผๅผๅ่ทจๆต่งๅจๆฉๅฑ๏ผๆฏๆ็ญๆดๆฐไปฅๅๆกๆถ devtools ่ฐ่ฏใ
็ฎๅๅผๅๆต่งๅจๆฉๅฑ็ๆต็จๅบๆฌ่ฟๆฏๅ่็ซ็ง็ๆนๅผ๏ผ
- ๅผ็จ็ JS ๆไปถๅๆ ทๅผๆไปถ้่ฆๆๅๅฐๆธ
ๅๆไปถ
manifest.jsonไธญ๏ผไธ่ฝไบซๅๆๅ ๅทฅๅ ท็ๅๅไผๅใ - ๅไธชๆต่งๅจ็ๆฉๅฑ API ๆฏๆไธๅฎๅ
จไธ่ด๏ผ
manifest.jsonๅ ๅฎนไนไธๅฎๅ จ็ธๅใ - ๆต่งๅจๅฏนๆฉๅฑ้กต้ข่ฎฟ้ฎๆ้ๅถ๏ผๆ ็ญๆดๆฐไปฅๅๆกๆถ devtools ้ฝไธ่ฝไฝฟ็จใ
ๆไปฅ้ๅฏน่ฟไบ้ฎ้ข๏ผๆ่ฎพ่ฎกไบไธๅฅ่ชๅจๅ่งฃๅณๆนๆก๏ผๅคงๅคง็ฎๅไบๅผๅๆต็จ๏ผ
- ๅบไบ Neutrino 9 ่ๆๆถๅผๅๆไปถ๏ผๅฏไปฅ็ปงๆฟๅ ถไผๅคไผ็น๏ผๅผ็ฎฑๅณ็จ๏ผๅฏ้ ็ฝฎๆง้ซ๏ผWebpack Chain๏ผ๏ผๆไธฐๅฏ็็ๆ๏ผๅฏนๅ็งๆกๆถใไปฃ็ ่ง่้ฝๆๅพๅฅฝ็ๆฏๆใ
- ้่ฟๅฎ็ฐไธไธชๆฉๅฑ็ฏๅขๆจกๆๅจๅจๆฎ้็ฝ้กตไธญ่ทๆฉๅฑ้กต้ข๏ผๆๅๆฏๆ็ญๆดๆฐไปฅๅๆกๆถ devtools ่ฐ่ฏใ
- ไธๅๆๅจ้ ็ฝฎๆธ ๅๆไปถ๏ผๆ็ผๅไบไธไธช Webpack ๆไปถ่ชๅจๅฐๆๅ ๅ็ๅไธชๅๆดๆฐๅฐๆธ ๅ็ธๅบ็้ ็ฝฎไธญใ
- ไธบๅไธชๆต่งๅจๅๅซ่ชๅจๆๅ ๏ผ่ชๅจ็ๆไธๅ็ๆธ ๅ้ ็ฝฎใ
File: projects/observable-hooks/en-US.md
React hooks for RxJS Observables with super flexible APIs.
Why:
- Component specific async logic, which are reused with the Component, no longer needs to be delegated to stateful parent or state management libraries.
- With React Hooks, logic can be encapsulated nicely together for easy testing.
- RxJS comes with a mature and abundant ecosystem which can address a wide range of async problems.
Features:
- Simple yer powerful API. Not only easier to use but also simpler to implement and faster to run.
- States, Props and Observables can interconvert into each other seamlessly.
- Observables can be operated directly, whether they are hooks generated or from outside of the Component.
- Operations on Observables are pure just like Epic in Redux Observable which can be reused and isolated for testing.
- Supports Render-as-You-Fetch pattern with Suspense.
- Fully tested. Stable API.
File: projects/observable-hooks/meta.json
{
"title": {
"zh-CN": "Observable Hooks",
"en-US": "Observable Hooks"
},
"url": "https://github.com/crimx/observable-hooks",
"stack": ["typescript", "react", "rxjs"],
"badges": {
"github": "crimx/observable-hooks",
"npm": "observable-hooks"
},
"hideExpand": false
}
File: projects/observable-hooks/zh-CN.md
้่ฟ React hooks ๅจ็ปไปถไธญๆ ็ผ่ฟๆฅ RxJS Observables ไปฅๅค็จๅผๆญฅ้ป่พใ
ไธบไปไน่ฆๅจ็ปไปถไธญๅค็จๅผๆญฅ้ป่พ๏ผ
- ไธไบๅช่ทๅฝๅ็ปไปถ็ธๅ ณ็ๅผๆญฅ้ป่พไธๅ้่ฆๅงๆๅฐ็ถ็ปไปถๆ่ ็ถๆ็ฎก็ๅบ๏ผไป่่พพๅฐ็ๆญฃ็็ปไปถๅค็จใ
- React Hooks ็ดงๅ็ไปฃ็ ้ฃๆ ผๅฏไปฅ่ฎฉ้ป่พๅฐ่ฃ ๅฐไธ่ตท๏ผๆดๆนไพฟ้็ฆปๆต่ฏใ
- ไฝฟ็จ RxJS ๆฏๅ ไธบๅ ถๆ็ไธฐๅฏ็็ๆ๏ผๅฏน็ฎๅๅฐๅคๆ็ๅผๆญฅ้ป่พ้ฝๆๅพๅฅฝ็่งฃๅณๆนๆกใ
็ธๆฏๅ็ฑปๅบไผๅฟ๏ผ
- ็ฎๆด็ API๏ผไธไป ๆดๅฎนๆไฝฟ็จไธๅฎ็ฐๆด็ฎๆด๏ผๅๆถๆ้ซไบๆง่ฝใ
- States ๅ Props ๅฏไปฅๆ ็ผไธ Observables ไบ็ธ่ฝฌๆขใ
- ๅฏๅฏนๅคไธช Observables ็ดๆฅ่ฟ่กๅ็งๆไฝ๏ผๆ ่ฎบๆฏ hooks ไธญ็ๆ็่ฟๆฏ็ปไปถไปฅๅค็ใ
- Observables ็ๆไฝๆฏ็บฏๅ็๏ผ็ฑปไผผไบ Redux Observable ็ Epic๏ผๅฏไปฅๅค็จไปฅๅๅ็ฌ่ฟ่กๆต่ฏใ
- ๆฏๆ็ปๅ Suspense ๅฎ็ฐ Render-as-You-Fetch ๆจกๅผใ
- ๅฎๅ็ๆต่ฏ๏ผAPI ็จณๅฎใ
File: projects/postcss-safe-important/en-US.md
PostCSS plugin that adds !important to style declarations safely. Used and recommended by many large projects like Uppy, stylelint, vmd and HoverCards.
- Accuracy. Unlike other regex based implementations, this plugin uses AST (Abstract Syntax Tree) generated by PostCSS to accurately locate rules.
- Safety. Adding
!importantto every declarations might break styles. This plugin will skip unnecessary declarations. - Configurability. Flexible and fine-grained control over the plugin.
File: projects/postcss-safe-important/meta.json
{
"title": {
"zh-CN": "PostCSS Safe Important",
"en-US": "PostCSS Safe Important"
},
"url": "https://github.com/crimx/postcss-safe-important",
"stack": [
"postcss"
],
"badges": {
"github": "crimx/postcss-safe-important",
"npm": "postcss-safe-important"
},
"hideExpand": false
}
File: projects/postcss-safe-important/zh-CN.md
[Binary file]
File: projects/projects/en-US.md
NUXT based static website.
With SSR generated static pages, DOM can be rendered before JavaScript loading, after which Vue will take over DOM manipulation and routing is controled by Vue-router.
ไธบ้กน็ฎไป็ปๆฝ่ฑกๅบๅ ฑ็จ้จๅ๏ผๅฎ็ฐ็ปไปถๅค็จ๏ผๆฏไธช้กน็ฎไป็ปๅช้็ฎๅ้ ็ฝฎๅณๅฏๆทปๅ ใ
Common parts of each project description are abstracted and resued. Adding a new project description can be achieved with minimum configuration.
Nuxt-i18n overrides Nuxt default routes and adds locale prefixes to every URL. Description of each project is written in Markdown and transformed to HTML via markdown-loader.
File: projects/projects/meta.json
{
"title": {
"zh-CN": "ๆฌ้กน็ฎ",
"en-US": "This Project"
},
"url": "https://github.com/crimx/crimx.github.io",
"stack": [
"nuxt",
"nuxt-i18n",
"vue"
],
"badges": {},
"hideExpand": false
}
File: projects/projects/zh-CN.md
ๅบไบ NUXT ็ๆ็้ๆ็ฝ็ซใ
ๅฉ็จ SSR ๏ผๆๅกๅจๆธฒๆ๏ผไธบๆฏไธช่ทฏ็ฑ็ๆไบ้ๆ้กต้ข๏ผๆ ๆๅผ้กต้ขๆ ้ๅ ่ฝฝ JavaScript ๅณๅฏๅผๅงๆธฒๆ DOM ๏ผๅพ JavaScript ๅ ่ฝฝๅฎๆๅ็ฑ Vue ๆฅ็ฎก DOM ไปฅๅ Vue-router ๆฅ็ฎก่ทฏ็ฑ่ทณ่ฝฌใ
ไธบ้กน็ฎไป็ปๆฝ่ฑกๅบๅ ฑ็จ้จๅ๏ผๅฎ็ฐ็ปไปถๅค็จ๏ผๆฏไธช้กน็ฎไป็ปๅช้็ฎๅ้ ็ฝฎๅณๅฏๆทปๅ ใ
ไฝฟ็จไบ nuxt-i18n ่ชๅจ็ๆๅค่ฏญ่จ่ทฏ็ฑ๏ผๅจๆๅ ่ฝฝ๏ผๆฏไธช้กน็ฎ็ๅฏๆๆฌไป็ป็จ Markdown ็ผๅ๏ผไฝฟ็จ markdown-loader ่ฝฌๆขไธบ HTML ๅ ่ฝฝใ
File: projects/react-resize-reporter/en-US.md
Lightweight React Component that reports width and height changes when its parent resizes.
Why:
- Currently there is no perfect solution for detecting element resizing.
- Existing solutions are either buggy or with verbose API.
Highlights:
- Clean API.
- Two implementations with same interface.
File: projects/react-resize-reporter/meta.json
{
"title": {
"zh-CN": "React Resize Reporter",
"en-US": "React Resize Reporter"
},
"url": "https://github.com/crimx/react-resize-reporter",
"stack": ["typescript", "react"],
"badges": {
"github": "crimx/react-resize-reporter",
"npm": "react-resize-reporter"
},
"hideExpand": false
}
File: projects/react-resize-reporter/zh-CN.md
็ๅฌ React ็ปไปถๅฐบๅฏธๅๅใ
ไธบไปไน๏ผ
- ็ฎๅๆฒกๆๅฎ็พ็่งฃๅณๆนๆก็ๅฌ React ็ปไปถๅฐบๅฏธๅๅใ
- ็ฐๆ็่งฃๅณๆนๆก่ฆไนไธ็จณๅฎ่ฆไนไฝฟ็จ้ๅธธๅฐๅฆ็ APIใ
ไบฎ็น๏ผ
- ็ฎๆด็ APIใ
- ไธค็งๅฎ็ฐๆนๅผ๏ผๅ ฑ็จไธๅฅ็ธๅ็ๆฅๅฃใ
File: projects/retux/en-US.md
Minimalist declarative type-safe(strongly-typed) scalable TypeScript Redux architecture.
Features
- Minimalist. Leveraging advanced features of TypeScript Retux reduces boilerplate code with better type-inferring and auto-completion.
- Declarative. Action-First instead of Action-Creator-Fisrt desgin results in code that is clean and easy to read for new contributors and future-self.
- Type-safe(strongly-typed). Retux enforces strict typings. With the utilities in Retux you will never lose the strictness of typings while enjoying great flexibility.
- Scalable. A Retux module can be easily split into isomorphic sub-modules. Retux can also optionally leverage the power of meta-programming on modern engine for further performance boost.
File: projects/retux/meta.json
{
"title": {
"zh-CN": "Retux",
"en-US": "Retux"
},
"url": "https://github.com/crimx/retux",
"stack": ["typescript", "redux", "lerna"],
"badges": {
"github": "crimx/retux"
},
"hideExpand": false
}
File: projects/retux/zh-CN.md
็ฎๆดใๅฃฐๆๅผใ็ฑปๅๅฎๅ จ๏ผๅผบ็ฑปๅ๏ผใๅฏๆฉๅฑ็ TypeScript Redux ๆถๆใ
็นๆง
- ็ฎๆดใๅๅฉ TypeScript ็้ซ็บง็นๆง Retux ๅจๅๅฐๆ ทๆฟไปฃ็ ็ๅๆถไฟๆๆดๅฅฝ็็ฑปๅๆจๅฏผๅ่ชๅจ่กฅๅ จใ
- ๅฃฐๆๅผใAction ไผๅ ่ไธๆฏ Action Creator ไผๅ ็่ฎพ่ฎกไฝฟๅฐไปฃ็ ๆดๅ ๆธ ๆฐๆๆ๏ผ็นๅซๆฏๅฏน้กน็ฎๆฐๆๅ่ฟๆๆชๆฅ็่ชๅทฑใ
- ็ฑปๅๅฎๅ จ๏ผๅผบ็ฑปๅ๏ผใRetux ไฝฟ็จไธฅๆ ผ็็ฑปๅใ้่ฟ Retux ็ๅทฅๅ ทๅฏไปฅ็ตๆดปๅฐ็ผๅ TypeScript ไปฃ็ ่ไธไผๅคฑๅป็ฑปๅ็ไธฅๆ ผๆงใ
- ๅฏๆฉๅฑใRetux ๆจกๅๅฏไปฅ่ฝปๆๅๅไธบๅคไธชๅๆ็ๅญๆจกๅใRetux ๅๆถๅฏไปฅๅจ็ฐไปฃๅผๆไธๅๅฉๅ ็ผ็จ่ฟไธๆญฅๆๅๆง่ฝใ
File: projects/saladict/en-US.md
A handy dictionary extension with eye-pleasing UI. Praised(Chrome review / Firefox review) and supported by hundreds of thousands of users.
Highlights in terms of functional design:
- Results from different dictionaries are integrated into one panel with consistent styles for easy cross-reference.
- Rapid searching with multiple search modes plus different profiles.
- Search text contexts as well as translations are kept in notebook.
- High accessibility. Inside iframes, PDFs and even outside of browser.
- Follow Unix philosophy. Focus on experience on looking up words while offering flexible interface for force multiplier effects with other tools.
Highlights in terms of technical implementation:
- Mass use of React Hooks for abstracting Component async UI logic, with RxJS handling complex user inputs(See my other project observable-hooks).
- Components are built with Storybook which enables rapid UI development.
- Syltes of dictionary panel and each dictionary are isolated with Shadow DOM with lower cost of performance.
- Automation are introduced into the build process(with my other project neutrino-webextension). Dictionaries are loaded with a plugin mechanism.
File: projects/saladict/meta.json
{
"title": {
"zh-CN": "Saladict ๆฒๆๆฅ่ฏ",
"en-US": "Saladict"
},
"url": "https://saladict.crimx.com/",
"stack": [
"typescript",
"react",
"observable-hooks",
"redux",
"redux-observable",
"redux-thunk",
"rxjs",
"dexie",
"i18next",
"antd",
"sass",
"neutrino",
"storybook"
],
"badges": {
"github": "crimx/ext-saladict",
"chrome": "cdonnmffkdaoajfknoeeecmchibpmkmg",
"firefox": "ext-saladict"
},
"hideExpand": false
}
File: projects/saladict/zh-CN.md
ไธไธๅ่ฏๆฉๅฑ๏ผๅ ถๆฐ้ข็่ฎพ่ฎกไธๅฎ็ฐๅพๅฐๅคง้็จๆท็่ฏๅฎไธๅ็ฑใ่ฎธๅค็จๆท็่จ่ฏไปท๏ผ่ฐทๆญ็่จ / ็ซ็็่จ๏ผ่ฟๆฏๅ ถ็จ่ฟๆๅฅฝ็จ็ๅ่ฏๆฉๅฑใ
ๅ่ฝ่ฎพ่ฎก็ไบฎ็น๏ผ
- ่ๅๅคไธช่ฏๅ ธ็็ปๆๅฏไปฅๅๅๆ้ฟ๏ผๅนถ็จ็ปไธ็้ฃๆ ผ้ๆๆพ็คบ๏ผๆๅคงๅฐๆนไพฟไบไบคๅๆฅ้ ่ฏๅ ธใ
- ๅค้ๅ่ฏๆจกๅผๅ็ปๅๅค็งๆ ๆฏๆจกๅผ่ฝ่ฎฉ็จๆทๅฟซ้ๅๆข๏ผไปฅไธๅๆนๅผ็ตๆดปๆฅ่ฏใ
- ็่ฏๆฌไฟ็ไบๆฅ่ฏ็ไธไธๆๅนถ่ชๅจ่ทๅๆดๅฅ็ฟป่ฏ๏ผไปฅไฟ่ฏๅ็กฎ็่งฃใ่ฎฐๅฟๅ่ฏใ
- ้ซๅฏ่ฎฟ้ฎๆง๏ผๅ ผๅฎนๅ็งๅคๆไธไธ็็ฝ้กต๏ผๅ ผๅฎน iframe ๅ ๅ่ฏ๏ผๆฏๆ PDF ๅ่ฏใ
- Unix ๅฒๅญฆ๏ผไธๆณจๆฅ่ฏๅนถๆไพ็ตๆดป็ๆฅๅฃ๏ผ้ ๅๅ ถๅฎๅทฅๅ ทๅๆฅๆดๅผบๅคง็ๅ่ฝใ
ๆๆฏๅฎ็ฐ็ไบฎ็น๏ผ
- ๅคง้ไฝฟ็จ React Hooks ไธบ็ปไปถๅค็จๅผๆญฅไบคไบ้ป่พ๏ผๅฉ็จ RxJS ๅค็ๅคๆ็็จๆท่พๅ ฅ๏ผๅๆถไธบๆญคๅผๅๅบๅฆไธ้กน็ฎ observable-hooksใ
- ไฝฟ็จ Storybook ๅผๅ็ปไปถ๏ผๅจๅฏ่งๅ็ฏๅขไธญๅฟซ้่ฐ่ฏใ
- ๅจ React ไธไฝฟ็จ Shadow DOM ไปฅ่พไฝๆๆฌ้็ฆป่ฏๅ ธ้ขๆฟไปฅๅๅไธช่ฏๅ ธ็ๆ ทๅผใ
- ๆดๅ่ฏๅ ธ็ปๆ้่ฆ็่งฃไธๅ่ฏๅ ธ็ฝ้กต็่ฎพ่ฎก๏ผๅนถไปไธญๆป็ปๅบ่งๅพ๏ผ็จณๅฎๅฐไธบ็จๆทๆ็ผๅฑ็ฐๆ็จ็ไฟกๆฏใ
- ่ชๅจๅๆๅปบ่ๆฌ๏ผไธบๆญคๅผๅๅบไธ็จ่ๆๆถๆไปถ neutrino-webextensionใไปฃ็ ็ปๆๅคๅฑๆฝ่ฑก๏ผๆทปๅ ่ฏๅ ธ้็จๆไปถๅผๆบๅถ่ฝฝๅ ฅใ
File: projects/side-effect-manager/en-US.md
A tiny library to encapsulate side effects in a compact, reusable and testable style.
File: projects/side-effect-manager/meta.json
{
"title": {
"zh-CN": "Side Effect Manager",
"en-US": "Side Effect Manager"
},
"url": "https://github.com/crimx/side-effect-manager",
"stack": ["typescript"],
"badges": {
"github": "crimx/side-effect-manager",
"npm": "side-effect-manager"
},
"hideExpand": true
}
File: projects/side-effect-manager/zh-CN.md
ไธไธช่ถ ๅฐ็ๅบ็จไบไปฅ็ดงๅใๅฏๅค็จใๅฏๆต่ฏ็ๆนๅผ็ผๅๅฏไฝ็จไปฃ็ ใ
File: projects/use-suspensible/en-US.md
React hooks that can make any data suspensible.
Why:
If you follow the Relay Suspense pattern you need to add wrappers to async logic then use read() to get data in Components.
This means:
- It can only apply to Promise based async logic.
- You have to write logic and use data in a specific way.
- When you successfully
read()a piece of data, it means the data is "fetched" but not necessary "usable"(unless you write business logic in a conventional way to make sure they are the same). You still need to add logic to check e.g. variation/validation of the data.
use-suspensible does not care how you implement the business logic. It only cares about if the data is usable or not. This makes it a universal solution for Suspense.
With use-suspensible you simply fetch and use data as usual/you like. It just works (with almost no cost).
File: projects/use-suspensible/meta.json
{
"title": {
"zh-CN": "Use Suspensible",
"en-US": "Use Suspensible"
},
"url": "https://github.com/crimx/use-suspensible",
"stack": ["typescript", "react"],
"badges": {
"github": "crimx/use-suspensible",
"npm": "use-suspensible"
},
"hideExpand": false
}
File: projects/use-suspensible/zh-CN.md
ๅฏไปฅ่ฎฉไปปไฝๆฐๆฎ่งฆๅ Suspense ็ React hooksใ
ไธบไปไน๏ผ
ๅฆๆไฝฟ็จ Relay Suspense ๆนๅผ่ฟ่กๅผๅ็่ฏ้่ฆๅฏนๅผๆญฅ้ป่พ่ฟ่กๅ ่ฃ ็ถๅๅจ็ปไปถไธญไฝฟ็จ read() ๆฅ่ทๅๆฐๆฎใ
่ฟๆๅณ็๏ผ
- ่ฟ็งๆนๅผๅช่ฝๅบ็จๅฐๅบไบ Promise ็ๅผๆญฅ้ป่พใ
- ้ป่พ็ผๅๅๆฐๆฎไฝฟ็จ้่ฆๆ็ ง็นๅฎ็ๆนๅผใ
- ๅฝไป
read()ๆๅ่ทๅพๆฐๆฎ๏ผ่ฟไป ไปฃ่กจๆฐๆฎโๆๅ่ฟๅโ่ไธไธๅฎ่ฟไธชๆฐๆฎๆฏโๅฏ็จ็โ๏ผ้ค้ๅจ้ป่พ็ผๅไธๅ็ธๅบ็่ง่่ฆๆฑไธค่ ไธ่ด๏ผใๆไปฅ่ทๅพๆฐๆฎๅไพ็ถ่ฟ่ฆๅๅ็งๅคๆญ้ช่ฏๆฐๆฎใ
use-suspensible ไธๅจไนๅผๆญฅ้ป่พๆฏๆไนๅฎ็ฐ็๏ผๅฎๅชๅ ณๅฟ่ฟไธชๆฐๆฎๆฏๅฆๅฏ็จ๏ผไธๅฏ็จไพฟ่งฆๅ Suspenseใ่ฟไฝฟๅฐๅฎๆฏไธ็ง้็จ็ Suspense ่งฃๅณๆนๆกใ
ไฝฟ็จ use-suspensible ๅช้่ฆๆไน ๆฏ็ๆนๅผ่ทๅๅไฝฟ็จๆฐๆฎๅณๅฏ๏ผ้ป่พ็ผๅไธ้่ฆๅไปปไฝๆนๅใ
File: projects/value-enhancer/en-US.md
A tiny library to enhance value with reactive wrapper.
File: projects/value-enhancer/meta.json
{
"title": {
"zh-CN": "Value Enhancer",
"en-US": "Value Enhancer"
},
"url": "https://github.com/crimx/value-enhancer",
"stack": ["typescript"],
"badges": {
"github": "crimx/value-enhancer",
"npm": "value-enhancer"
},
"hideExpand": true
}
File: projects/value-enhancer/zh-CN.md
ไธไธช่ถ ๅฐ็ๅบ็จไบๅๅบๅผ็ผ็จใ
File: projects/webextension-store-meta/en-US.md
Get browser extension(webextension) item meta from Chrome Web Store and Firefox add-ons. Used by Shields.io and Badgen.
File: projects/webextension-store-meta/meta.json
{
"title": {
"zh-CN": "Webextension Store Meta",
"en-US": "Webextension Store Meta"
},
"url": "https://github.com/crimx/webextension-store-meta",
"stack": ["vanilla-js"],
"badges": {
"github": "crimx/webextension-store-meta",
"npm": "webextension-store-meta"
},
"hideExpand": true
}
File: projects/webextension-store-meta/zh-CN.md
่ทๅๆต่งๅจๆฉๅฑๅ ๆฐๆฎ๏ผไฝฟ็จ่ฝป้ใ็จณๅฎใ้ซๆ็ๆนๅผใๅทฒ่ขซ่ๅ็ๅผๆบๅพฝ็ซ ๅบ Shields.io ๅ Badgen ้็จใ
File: projects/webpack-target-webextension/en-US.md
WebExtension Target for Webpack 4. Supports code-splitting with native dynamic import.
Dynamically loading chunks is not possible in WebExtension content scripts with the default Webpack JSONP.
This library is also included in the neutrino-webextension preset.
File: projects/webpack-target-webextension/meta.json
{
"title": {
"zh-CN": "Webpack Target WebExtension",
"en-US": "Webpack Target WebExtension"
},
"url": "https://github.com/crimx/webpack-target-webextension",
"stack": ["webpack"],
"badges": {
"github": "crimx/webpack-target-webextension",
"npm": "webpack-target-webextension"
},
"hideExpand": false
}
File: projects/webpack-target-webextension/zh-CN.md
้็จไบ Webpack 4 ็ WebExtension Target ใๅฉ็จๅ็ import ๅจๆๅ ่ฝฝๅๅใ
Webpack ้ป่ฎค็ JSONP ๆบๅถๆ ๆณๅจ WebExtension ็ content scripts ไธญๅจๆๅ ่ฝฝๅๅใ
็ธๅ ณๅ็่งๆ็ๆ็ซ ใ่ชๅฎไน Webpack Targetใใ
่ฟไธชๅบๅทฒ็ปๅ ็ฝฎๅฐ neutrino-webextension preset ไธญใ
File: projects/weitweet/en-US.md
Chrome / Firefox extension. Share Fanfou, Twitter and Weibo in one click.
- Abstract OAuth 1a & 2 flows using template design pattern to support different platforms๏ผOAuth 1a with Fanfou and Twitter, Oauth 2 with Weibo๏ผ.
- Serverless OAuth flow with
chrome.identityand content script magic. - UI with iview.
- Build system is vue-cli based and extended with webpack-chain, which enables building and packing in one click.
File: projects/weitweet/meta.json
{
"title": {
"zh-CN": "ๅฐๆจ WeiTweet",
"en-US": "WeiTweet"
},
"url": "https://github.com/crimx/crx-weitweet",
"stack": [
"typescript",
"vue",
"iview",
"sass"
],
"badges": {
"github": "crimx/crx-weitweet",
"chrome": "jcgjbjbbcjgkpdanbnafdbdlbjacdkln",
"firefox": "weitweet"
},
"hideExpand": false
}
File: projects/weitweet/zh-CN.md
ไธๆฌพๅฏไปฅๅไบซ็ฝ้กตๅฐ้ฅญๅฆใๆจ็นๅๅพฎๅ็ Chrome / Firefox ๆฉๅฑใๅนถๅฏไปฅไป็ฝ้กตไธญๆๅๆๆๅพ็ใ
- ๅฏน OAuth 1a ไธ 2 ็้ช่ฏๆต็จๆถๅ็่งฃ๏ผๅนถๆฝ่ฑกๅบ้็จ็ฑปๅฉ็จๆจกๆฟๆจกๅผๆฏๆๅไธชๅนณๅฐ๏ผ้ฅญๅฆไธๆจ็นไฝฟ็จ OAuth 1a๏ผๅพฎๅไฝฟ็จ Oauth 2๏ผใ
- ๅฉ็จ
chrome.identityไปฅๅ content script ้ป็งๆๅฎ็ฐ OAuth ็ๆ ๆๅกๅจ่ชๅจๆๆใ - UI ๅฎๅ จๅบไบ iview ใ
- ไปฃ็ ๆๅปบ็ณป็ปๅฉ็จ webpack-chain ๅบไบ vue-cli ๅฑๅผ๏ผไธ้ฎๆๅปบๆๅ ใ
File: static/ads.txt
google.com, pub-6993077405597797, DIRECT, f08c47fec0942fa0