Adil Imranã¯ããã®åéã§é·ãéåããŠããã圌ã®çµéšããã¹ããã©ã¯ãã£ã¹ã芳å¯çµæãããã°ã§ååãšå ±æããŠããããã°ã©ããŒã§ãã Adilã®æ°ããèšäºã¯ãããŸãæ©èœããçŸããããããªã³ãŒããæžãã®ã«åœ¹ç«ã€ããŒã«ã«é¢ãããã®ã§ãã
èè ããïŒè¯ãã³ãŒããæžãããããã©ãããå§ããã°ãããããããªãã®ã§ããããèªãã§ã¿ãŠãèªãã ãã®ãå®è·µããŠãã ããã ããã§ããçãããã質åã®æ¹ãå€ãã§ãã ãããããã³ãŒããåé€ããå¿ èŠããããŸããïŒ ãã§ã«èšè¿°ãããŠãããããžã§ã¯ãã§æªäœ¿çšã®å€æ°ãèŠã€ãã£ãå Žåã¯ã©ãããã°ããã§ããïŒ åé¡ã®ãããã¿ãŒã³ãèŠã€ããŠãã¹ãŠãä¿®æ£ããæ¹æ³ã¯ïŒ ãããã®è³ªåã¯éèŠã§ãããç§ãã¡ã®å€ãã¯ãããã«çããããšããŠããŸãã ããããæåã®æ¹æ³ã¯ããã¹ãŠããŒãããããŸãå®è¡ããããšã§ããããããã°ãåé¡ã®ããé åããããããŒã«ãæ¢ããŠæéãç¡é§ã«ããå¿ èŠããªããªããŸãã è¯ãã³ãŒããäœæããããã«ãäžå¯æ¬ ãšåŒã°ããããã€ãã®ããŒã«ããããŸãã
ãã®èšäºã§åãäžããäŸã¯Reactã«é¢é£ããŠããŸãããèªãã å 容ã¯ã»ãšãã©ãã¹ãŠã®Webãããžã§ã¯ãã«é©çšã§ããŸãã
Skillboxã®æšå¥šäºé ïŒå®è·µã³ãŒã¹ãProfession Web Developerã ã
ãHabrãã®èªè ã«ã¯ããHabrãããã¢ãŒã·ã§ã³ã³ãŒãã䜿çšããŠSkillboxã³ãŒã¹ã«ç»é²ãããš10,000ã«ãŒãã«ã®å²åŒããããŸãã
èšäºããŒã«ã®å šãªã¹ãã¯æ¬¡ã®ãšããã§ãã
- ããããã
- ESLint
- ä¿åæã«ãã©ãŒããããšãªã³ããèªååãã
- ãã¹ããŒ
- ãªã³ãã¹ããŒãž
- ãã¹ããŒãšãªã³ãã¹ããŒãžã®çµã¿åãã
- EditorConfig
ãããã«å§ããŸããã
ãã®ããŒã«ã¯ãã¹ããŒãã³ãŒããªããã£ãã€ã¶ãŒã§ãã
ãªãå¿ èŠãªã®ã§ããïŒ
æ¢è£œã®ã³ãŒããã¯ãªãŒã³ã¢ããããŸãã çŽ2äžè¡ãæé©åããå¿ èŠããããšæ³åããŠãã ããã Prettierã¯ããããã¹ãŠãèªåçãã€è¿ éã«è¡ããŸãã
䜿ãããããèªåã«åããããã-è€æ°ã®ããŒã ãPrettierã®æ¹åã«åãçµãã§ããã®ã§ãèªåã«åã£ãããŒãžã§ã³ãéžæã§ããŸãã
çŸããã³ãŒããæžãããããã©ãããå§ããã°ãããããããªãåå¿è ããã°ã©ããŒãªããPrettierãè©ŠããŠãã ããã
èšçœ®
appãšãããã©ã«ããŒãäœæããå¿ èŠããããŸãããŸãããã©ã«ããŒå ã«ã³ãã³ãã©ã€ã³ã§æ¬¡ã®ããã«å ¥åããŸãã
npm init -y
ãã®ã³ãã³ãã¯ãpackage.jsonãã¡ã€ã«ãäœæããŸãã
次ã«ãäŸåé¢ä¿ãæ±ããŸãã
yarn add --dev prettier
ã³ãã³ããå®è¡ãããšãäœæãããã¡ã€ã«å ã«æ¬¡ã®ããã«è¡šç€ºãããŸãã
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "prettier": "prettier --write src/**/*.js" }, "devDependencies": { "prettier": "^1.14.3" } }
次ã«ãã¢ããªãã©ã«ããŒå ã«src /ãã©ã«ããŒãäœæããŸãã ãããŠãsrc / index.jsãã¡ã€ã«å ã å®éã«å¥œããªååãä»ããããšãã§ããŸããäž»ãªããšã¯ãããã圌ã®äœã«æ¿å ¥ããããšã§ãïŒ
let person = { name: "Yoda", designation: 'Jedi Master ' }; function trainJedi (jediWarrion) { if (jediWarrion.name === 'Yoda') { console.log('No need! already trained'); } console.log(`Training ${jediWarrion.name} complete`) } trainJedi(person) trainJedi({ name: 'Adeel', designation: 'padawan' });
ããã§ãäžåšçšãªã³ãŒããå«ãsrc / app / index.jsãã§ããŸããã
次ã®æäœãå®è¡ã§ããŸãã
-æåã§ãã©ãŒãããããŸãã
-èªååã䜿çšããŸãã
-äœãããŸããïŒç©äºãé²ããŸãïŒã
3çªç®ã®ãªãã·ã§ã³ã¯éžæããªãæ¹ãè¯ãã§ãããããããªããã°ãã³ãŒããæé©åããããŒã«ãå¿ èŠãªã®ã¯ãªãã§ãã 2çªç®ã®ãªãã·ã§ã³ãéžæããŸãããã package.jsonãã¡ã€ã«å ã«äŸåé¢ä¿ãšPrettierã¹ã¯ãªããããããŸãã
appãã©ã«ããŒã«prettier.config.jsãäœæããŸãã
module.exports = { printWidth: 100, singleQuote: true, trailingComma: 'all', bracketSpacing: true, jsxBracketSameLine: false, tabWidth: 2, semi: true, };
printWidthã¯ãã³ãŒãã100æåãè¶ ããªãããã«ããŸãã
singleQuoteã¯ããã¹ãŠã®äºéåŒçšç¬Šãåäžã«å€æããŸãã
trailingCommaã¯ãç¹ã«ãªããžã§ã¯ãã®æåŸã®ããããã£ã®æåŸã§ãã³ãŒãå ã®ãã¹ãŠã®ã¶ãäžããã³ã³ãããã§ãã¯ããŸãã ããã§èª¬æããŸãã
bracketSpacingã¯ãªããžã§ã¯ããªãã©ã«ã®ã¹ããŒã¹ã管çããŸãïŒ
If bracketSpacing is true - Example: { foo: bar } If bracketSpacing is false - Example: {foo: bar} jsxBracketSameLine JSX- ">" // true example <button className="prettier-class" id="prettier-id" onClick={this.handleClick}> Click Here </button> // false example <button className="prettier-class" id="prettier-id" onClick={this.handleClick} > Click Here </button>
tabWidthã¯ãã€ã³ãã³ãã¬ãã«ã®ã¹ããŒã¹ã®æ°ãå®çŸ©ããŸãã
semi -trueã®å Žåãå°å·ããŸãã ã¹ããŒãã¡ã³ãã®æåŸã
Prettier ã§äœ¿çšã§ãããªãã·ã§ã³ã®å®å šãªãªã¹ãã以äžã«ç€ºããŸã ã
åææ§æã®æºåãã§ããããã¹ã¯ãªãããå®è¡ã§ããŸãã
ãããããïŒãããã-src / ** / *ãJsãæžã蟌ãã
äžèšã®äŸã§ã¯ãã¹ã¯ãªããã¯src /ãã©ã«ããŒå ã®ãã¹ãŠã®.jsãã¡ã€ã«ãæ¢ããŸãã
-writeã¯ãæé©åãããã³ãŒããã¡ã€ã«ãä¿åããå¿ èŠãããããšã瀺ããŸãã
ã¹ã¯ãªãããå®è¡ããŠã¿ãŸãããã
糞ãããã
ãµã³ãã«ã«åé¡ãããå Žåã¯ã ããã«ãã¹ãŠã®æºåãæŽã£ããªããžããªããããŸãã
ESLint
ãã®ããŒã«ã¯ã³ãŒããåæããŠãã«ãŒã«ãæšæºã«æºæ ããŠããªãåé¡ã®ãããã¿ãŒã³ã®æ€åºã«åœ¹ç«ã¡ãŸãã ã»ãšãã©ã®ããã°ã©ãã³ã°èšèªã§æ©èœããŸãã
JavaScriptã«é©çšãããšãã«ãªãå¿ èŠãªã®ã§ããïŒ
JavaScriptã¯ããªãèªç±ãªèšèªã§ãããããéçºè ã¯ãã°ãã°ééããç¯ããŸãã ESLintã¯ãæžãããããã°ã©ã ãå®è¡ããã«åé¡ãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
ESLintã¯ã©ã®ããã«ç¬èªã®ãã®ã®äžã§éç«ã£ãŠããŸããïŒ
èšå®ã¯ç°¡åã§ãéåžžã«æè»ã§ãã å¿ èŠã«å¿ããŠã«ãŒã«ãè¿œå ããã³åé€ã§ããŸã-æåéããã¹ãŠãèšå®ãããŠããŸãã ãã®ããã䜿çšããäžé£ã®ã«ãŒã«ã«åŸã£ãŠã³ãŒãããã©ãŒãããã§ããŸãã
çŸåšã2ã€ã®ã¹ã¿ã€ã«ã¬ã€ããæãé¢é£ããŠããŸãã
- Google JavaScriptã¹ã¿ã€ã«ã¬ã€ã
- Airbnb JavaScriptã¹ã¿ã€ã«ã¬ã€ã
ç§ã«ã€ããŠã¯ã2çªç®ã®ãªãã·ã§ã³ããå§ãããŸãã 圌ã¯éåžžã«äººæ°ãããã 圌ã®GitHubã«ã¢ã¯ã»ã¹ããŠç¢ºèªã§ããŸã ã
ãŸããpackage.jsonãã¡ã€ã«ãæŽæ°ããŸãããã
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "lint": "eslint --debug src/", "lint:write": "eslint --debug src/ --fix", "prettier": "prettier --write src/**/*.js" }, "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] }, "devDependencies": { "babel-eslint": "^8.2.3", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0", "eslint-config-jest-enzyme": "^6.0.2", "eslint-plugin-babel": "^5.1.0", "eslint-plugin-import": "^2.12.0", "eslint-plugin-jest": "^21.18.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-prettier": "^2.6.0", "eslint-plugin-react": "^7.9.1", "husky": "^1.1.2", "lint-staged": "^7.3.0", "prettier": "^1.14.3" } }
åãªãã·ã§ã³ã®æå³ïŒ
eslint ïŒããã¯ãã€ãã£ãã³ãŒããæäœããããã®ã¡ã€ã³ããŒã«ã§ãã
babel-eslint ïŒ ESLintã§ãŸã ãµããŒããããŠããªãFlowãŸãã¯å®éšçæ©èœã䜿çšããå Žåã«åœ¹ç«ã¡ãŸãã
eslint-config-airbnb ïŒãã®ããã±ãŒãžã¯ãéçºè ã«Airbnbã®ESLintèšå®ãæäŸããŸãã
eslint-plugin-babelïŒ babel-eslintã®ã³ã³ãããªã³ãã©ã°ã€ã³ã
eslint-plugin-reactïŒåå¿çšã«æé©åããŸãã
eslint-plugin-importïŒ ES2015 +ïŒES6 +ïŒã€ã³ããŒã/ãšã¯ã¹ããŒãæ§æãæäœããæ©èœãæäŸããŸãã
eslint-plugin-prettierïŒ ESLintãšPrettierã®çžäºäœçšãæé©åããŸãã
åºæ¬çãªããšã¯çµãããŸããã®ã§ãå§ããŸãããã ããšãã°ãapp /ãã©ã«ããŒã«.eslintrc.jsãã¡ã€ã«ãäœæããŸãã
module.exports = { env: { es6: true, browser: true, node: true, }, extends: ['airbnb', 'plugin:jest/recommended', 'jest-enzyme'], plugins: [ 'babel', 'import', 'jsx-a11y', 'react', 'prettier', ], parser: 'babel-eslint', parserOptions: { ecmaVersion: 6, sourceType: 'module', ecmaFeatures: { jsx: true } }, rules: { 'linebreak-style': 'off', // Don't play nicely with Windows. 'arrow-parens': 'off', // Incompatible with prettier 'object-curly-newline': 'off', // Incompatible with prettier 'no-mixed-operators': 'off', // Incompatible with prettier 'arrow-body-style': 'off', // Not our taste? 'function-paren-newline': 'off', // Incompatible with prettier 'no-plusplus': 'off', 'space-before-function-paren': 0, // Incompatible with prettier 'max-len': ['error', 100, 2, { ignoreUrls: true, }], // airbnb is allowing some edge cases 'no-console': 'error', // airbnb is using warn 'no-alert': 'error', // airbnb is using warn 'no-param-reassign': 'off', // Not our taste? "radix": "off", // parseInt, parseFloat radix turned off. Not my taste. 'react/require-default-props': 'off', // airbnb use error 'react/forbid-prop-types': 'off', // airbnb use error 'react/jsx-filename-extension': ['error', { extensions: ['.js'] }], // airbnb is using .jsx 'prefer-destructuring': 'off', 'react/no-find-dom-node': 'off', // I don't know 'react/no-did-mount-set-state': 'off', 'react/no-unused-prop-types': 'off', // Is still buggy 'react/jsx-one-expression-per-line': 'off', "jsx-a11y/anchor-is-valid": ["error", { "components": ["Link"], "specialLink": ["to"] }], "jsx-a11y/label-has-for": [2, { "required": { "every": ["id"] } }], // for nested label htmlFor error 'prettier/prettier': ['error'], }, };
.eslintignoreãã¡ã€ã«ãapp /ãã©ã«ããŒã«è¿œå ããŸãã
/.git
/.vscode
node_modules
.eslintrc.jsãã¡ã€ã«ã¯äœãããŸããïŒ
èŠãŠã¿ãŸãããïŒ
module.exports = { env:{}, extends: {}, plugin: {}, parser: {}, parserOptions: {}, rules: {}, };
envïŒç°å¢ã¯ãäºåå®çŸ©æžã¿ã®ã°ããŒãã«å€æ°ãå®çŸ©ããŸãã ãã®ã±ãŒã¹ã§äœ¿çšå¯èœãªç°å¢ã¯ães6ããã©ãŠã¶ãããã³ããŒââãã§ãã Es6ã¯ãã¢ãžã¥ãŒã«ãé€ãECMAScript 6é¢æ°ã䜿çšå¯èœã«ããŸãã ãã©ãŠã¶ã¯ãWindowsãªã©ã®ãã¹ãŠã®ã°ããŒãã«å€æ°ãè¿œå ããŸãã ãããã£ãŠãããŒãã¯ãã¹ãŠã®ã°ããŒãã«ããŒãå€æ°ãè¿œå ããŸãã
extendsïŒæååã®é å-è¿œå ã®åæ§æã¯åã®ãã®ãæ¡åŒµããŸãã çŸåšãairbnbã§jestã«æ¡åŒµãã次ã«jest-enzymeã«æ¡åŒµãããªã³ãã£ã³ã°ã«ãŒã«ã䜿çšããŠããŸãã
ãã©ã°ã€ã³ïŒãããã¯ã䜿çšãããåºæ¬çãªãªã³ãã£ã³ã°èŠåã§ãã babelãimportãjsx-a11yãreactãprettierãããã³äžèšã§æå®ãããã¹ãŠã®ãã®ã䜿çšããŸãã
ããŒãµãŒïŒ ESLintã¯ããã©ã«ãã§Espreeã䜿çšããŸãããbabelã§äœæ¥ããããã Babel-ESLintã䜿çšããå¿ èŠããããŸãã
parserOptionsïŒEspreeã®ããã©ã«ãã®ããŒãµãŒãbabel-eslintã«å€æŽããå ŽåãparserOptionsãæ確ã«ããå¿ èŠããããŸãã
ã«ãŒã«ïŒããã§å€æŽãŸãã¯çœ®æã§ããã«ãŒã«ã
ãã¹ãŠãæ確ã§ããã°ã.eslintignoreã«ã€ããŠè©±ããŸãããã ãã®ãªãã·ã§ã³ã¯ãESLintã䜿çšããŠåŠçããå¿ èŠã®ãªããã¹ãŠã®ãã¹ã瀺ãã®ã«åœ¹ç«ã¡ãŸãã ç§ã¯ãã®ãããª3ã€ã®ãã¹ã®ã¿ã䜿çšããŸãã
/.git-gitãã¡ã€ã«ã«åœ±é¿ãäžããããªãå Žå
/.vscodeãç§ã¯VS Codeã䜿çšããŠããããã®ãšãã£ã¿ãŒã«ã¯ç¬èªã®æ§æãããããããžã§ã¯ãããšã«æ確åããå¿ èŠããããããã§ã¯è©³ãã説æããŸããã
node_modules-äŸåé¢ä¿ãå€æŽããªãããããªã¹ãã«è¿œå ããŸããã
以äžã§ãpackage.jsonã«æ°ããè¿œå ãããã¹ã¯ãªããã«ã€ããŠã話ããŸãããã
ããªã³ããïŒãeslint --debug src /ã
ããªã³ãïŒæžã蟌ã¿ãïŒãeslint --debug src / --fixã
$ yarn lint-ãã®ã³ãã³ããå®è¡ãããšãsrc /å ã®ãã¹ãŠã®ãã¡ã€ã«ããã§ãã¯ããŸãããã®çµæããšã©ãŒãæ€åºãããåãã¡ã€ã«ã®åé¡ç®æã®èª¬æãå«ã詳现ãªãã°ãååŸããæåã§éå§ããŠä¿®æ£ã§ããŸãã
$ yarn lintïŒwrite-ãã®ã³ãã³ãã¯åã®ãã®ãšã»ãŒåãããšãè¡ããŸãã å¯äžã®éãã¯ã糞ããã§ã«ããã§æžã蟌ã¿èš±å¯ãæã£ãŠããããšã§ããã³ãã³ãã¯ãã³ãŒããããšã©ãŒãåé€ããããšã§ãšã©ãŒãä¿®æ£ããŸãã
ã ããããŸããããªãããã®ç¬éãŸã§å·®ãåºãããªããåèªãšè³è³ãããªãã«ããã
ãã¹ããŒ
ããŠãããã§ãã³ãããäžã«ããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã³ãŒãããã©ã³ãã«ããã·ã¥ãããã§ããŸãã
ããªããããå¿ èŠãããã®ã¯ããã¹ããŒãã€ã³ã¹ããŒã«ããã ãã§ãïŒ
yarn add --devãã¹ããŒ
次ã«ãã¹ãããããpackage.jsonãã¡ã€ã«ã«è¿œå ããŸãã
"husky": { "hooks": { "pre-commit": "YOUR_COMMAND_HERE", "pre-push": "YOUR_COMMAND_HERE" } },
ããã§ãã³ããããŸãã¯ããã·ã¥ã®ãã³ã«ãã¹ããããã¯ç¹å®ã®ã¹ã¯ãªãããŸãã¯ã³ãã³ãïŒã³ãŒããã©ãŒãããã³ãã³ããªã©ïŒã®å®è¡ãéå§ããŸãã
ãªã³ãã¹ããŒãž
äžæ£ãªã³ãŒããgitãã©ã³ãã«äŸµå ¥ããã®ãé²ããŸãã
ãªããªã³ãã¹ããŒãžåãããã®ã§ããïŒ
ã»ãšãã©ã®å Žåãã³ãŒãæ€èšŒã¯ã³ãããããåã«å®è¡ããå¿ èŠããããŸãã ãããã£ãŠããšã©ãŒããªããžããªãŒã«å ¥ãã®ãé²ããããã°ã©ã ã®å šäœçãªå質ãåäžãããããšãã§ããŸãã ãã ãããããžã§ã¯ãå šäœã§lintãèµ·åããã®ã¯ããªãé ãããã»ã¹ã§ãããåŠççµæã¯ç¡é¢ä¿ãããããŸããã æåŸã«ãã³ããããããã¡ã€ã«ã®ã¿ãåŠçããå¿ èŠããããŸãã
å¿ èŠãªã®ã¯ããããžã§ã¯ããã€ã³ã¹ããŒã«ããããšã ãã§ãã
yarn add --dev lint-staged
次ã«ããããpackage.jsonãã¡ã€ã«ã«è¿œå ããŸãã
"lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] },
ãããã£ãŠãlintïŒwriteãéå§ãããããã¹ããŒãžé åã«è¿œå ããŸãã ãã®ã³ãã³ãã¯.jsããã³.jsxãã¡ã€ã«ã«å¯ŸããŠæ©èœããŸãããå¿ èŠã«å¿ããŠä»ã®ãã¡ã€ã«ã«å¯ŸããŠãåãããšãè¡ãããšãã§ããŸãã
ãã¹ããŒãšãªã³ãã¹ããŒãžã®çµã¿åãã
ã³ãŒããã³ããããããã³ã«ãlint-stagedãšããã¹ã¯ãªãããå®è¡ãããŸãã npm run lintïŒwriteã®å®è¡ãéå§ããŸããããã«ãããã³ãŒãã確èªããã³ãã©ãŒãããã§ããŸãã 次ã«ãæ¢ã«æ€èšŒãããã³ãŒããã¹ããŒãžã®ã¹ããŒãžã«åé¡ãããã³ããããå®è¡ãããŸãã
æçµçãªpackage.jsonãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "lint": "eslint --debug src/", "lint:write": "eslint --debug src/ --fix", "prettier": "prettier --write src/**/*.js" }, "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] }, "devDependencies": { "babel-eslint": "^8.2.3", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0", "eslint-config-jest-enzyme": "^6.0.2", "eslint-plugin-babel": "^5.1.0", "eslint-plugin-import": "^2.12.0", "eslint-plugin-jest": "^21.18.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-prettier": "^2.6.0", "eslint-plugin-react": "^7.9.1", "husky": "^1.1.2", "lint-staged": "^7.3.0", "prettier": "^1.14.3" } }
ä»ãããªãã¯ããããããã³ã«
$ git addã
$ git commit -m "説æçãªã¡ãã»ãŒãžãããã«ãããŸã"
ã³ãŒãã¯ã.eslintrc.jsãã¡ã€ã«ã®ã«ãŒã«ã«åºã¥ããŠèªåçã«ãã©ãŒããããããŸãã
EditorConfigã«ã€ããŠè©±ã
ãŸããapp /ãã£ã¬ã¯ããªã«.editorconfigãã¡ã€ã«ãäœæããŸãã 次ã®ã³ãŒããããã«è²Œãä»ããŸãïŒ
# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true [*.md] trim_trailing_whitespace = false [*.js] trim_trailing_whitespace = true # Unix-style newlines with a newline ending every file [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 insert_final_newline = true max_line_length = 100
以äžã¯EditorCondigããµããŒããããšãã£ã¿ãŒã®ãªã¹ãã§ãã ãªã¹ãã«ã¯ãWebã¹ããŒã ãã¢ããªã³ãŒããAtomãEclipseãemacsãbbeditãå«ãŸããŸãã
äžèšã®ã³ãŒãã¯ãããè¡ããŸãïŒ
- .mdããã³.jsãã¡ã€ã«ãã空çœãåé€ããŸãã
- ã¹ããŒã¹ã®ä»£ããã«ã€ã³ãã³ãã¹ã¿ã€ã«ãæå®ããŸãã
- ã€ã³ãã³ããµã€ãºã2ã«èšå®ããŸãã
- è¡ã®çµãããåäžã®æšæºã«å°ããŸãã
- ãã¡ã€ã«ã®æåŸã«æ°ããè¡ãè¿œå ããŸãã
- æååã®é·ãã100æåã«èšå®ããŸãã
å®éãããã§ãã¹ãŠã®æºåãæŽããŸããã ãœãŒã¹ã³ãŒããå¿ èŠãªå Žå㯠ã ããã«ãããŸãã
Skillboxã®æšå¥šäºé ïŒ
- ãªã³ã©ã€ã³ã³ãŒã¹ãProfession frontend-developerã
- å®è·µã³ãŒã¹ãMobile Developer PROã ã
- å®è·µçãªå¹Žéã³ãŒã¹ãPHPéçºè ãããŒããŸã§ã