{"@attributes":{"version":"2.0"},"channel":{"title":"Hsien \u2764\ufe0f Web","link":"https:\/\/jackblackevo.github.io\/","description":{},"pubDate":"Sun, 22 Jul 2018 17:37:55 +0000","item":[{"title":"macOS CLI \u74b0\u5883\u5efa\u7f6e\uff1aZsh","link":"\/2017\/10\/25\/improve-macos-cli-zsh.html","guid":"\/2017\/10\/25\/improve-macos-cli-zsh.html","description":"<p>\u524d\u4e00\u7bc7\u5b89\u88dd\u597d iTerm2 \u53ca Homebrew \u5f8c\uff0c\u9019\u6b21\u8981\u5c07 Shell \u5f9e bash \u6539\u70ba\u66f4\u5f37\u5927\u7684 <a href=\"https:\/\/www.zsh.org\/\">Zsh<\/a>\u3002Zsh \u64c1\u6709\u81ea\u52d5\u88dc\u9f4a\u6307\u4ee4\u3001\u8def\u5f91\u3001\u8b8a\u6578\u7b49\u7b49\u7684\u529f\u80fd\uff0c\u4e26\u53ef\u4ee5\u4f9d\u64da\u81ea\u8eab\u9700\u6c42\u518d\u52a0\u88dd plug-ins\u3002<\/p>\n\n<p>\u96d6\u7136 Zsh \u76f8\u8f03\u65bc\u4e4b\u524d\u4ecb\u7d39\u904e\u7684 fish \u4ecd\u6709\u8a31\u591a\u4e0d\u8db3\u4e4b\u8655\uff0c\u4f46 Zsh \u6700\u5927\u7684\u512a\u52e2\u5728\u65bc\u76f8\u5bb9\u65bc bash\uff0c\u4e0d\u5fc5\u91cd\u65b0\u5b78\u7fd2\u7279\u6709\u7684 shell script\u3002\u4e0d\u5f97\u4e0d\u8aaa fish \u7684\u81ea\u52d5\u88dc\u9f4a\u4ee5\u53ca\u6307\u4ee4\u63d0\u793a\u771f\u7684\u975e\u5e38\u5f37\u5927\uff0c\u5c24\u5176\u662f\u4f7f\u7528 <code class=\"highlighter-rouge\">git add [deep\/path\/file]<\/code> \u6642\u9084\u53ef\u4ee5\u53ea\u6253\u90e8\u5206\u6a94\u540d\u518d\u52a0 <kbd>Tab<\/kbd> \u5c31\u80fd\u88dc\u9f4a\u6b63\u78ba\u8def\u5f91\uff01<\/p>\n\n<h2 id=\"\u5b89\u88dd-zsh\">\u5b89\u88dd Zsh<\/h2>\n<p>macOS \u5df2\u5167\u5efa Zsh\uff0c\u4f46\u7248\u672c\u8f03\u820a\u3002\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 Homebrew \u4f86\u5b89\u88dd\u6700\u65b0\u7248\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install zsh\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u5c07-zsh-\u8a2d\u70ba\u9810\u8a2d-shell\">\u5c07 Zsh \u8a2d\u70ba\u9810\u8a2d shell<\/h2>\n<p>\u5148\u5c07\u6211\u5011\u900f\u904e Homebrew \u5b89\u88dd\u7684 Zsh \u8def\u5f91\u52a0\u5165 \/etc\/shells \u4e2d\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"k\">$(<\/span>which zsh<span class=\"k\">)<\/span> | <span class=\"nb\">sudo <\/span>tee <span class=\"nt\">-a<\/span> \/etc\/shells\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4f7f\u7528\u4ee5\u4e0b\u6307\u4ee4\u5c07 Homebrew \u5b89\u88dd\u7684 Zsh \u8a2d\u70ba\u9810\u8a2d shell\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>chsh <span class=\"nt\">-s<\/span> <span class=\"k\">$(<\/span>which zsh<span class=\"k\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u53ea\u5728-iterm2-\u4e2d\u4f7f\u7528-zsh\">\u53ea\u5728 iTerm2 \u4e2d\u4f7f\u7528 Zsh<\/h3>\n<p>\u5982\u679c\u53ea\u60f3\u5728 iTerm2 \u4e2d\u4f7f\u7528 Zsh\uff0c\u53ef\u4ee5\u5f9e\u9078\u55ae\u5217\uff1a<\/p>\n\n<ul>\n  <li>iTerm2 -&gt; Preferences -&gt; Profiles -&gt; General<\/li>\n<\/ul>\n\n<p>\u8a2d\u5b9a Command \u70ba \/usr\/local\/bin\/zsh\u3002<\/p>\n\n<h3 id=\"\u5c07\u9810\u8a2d-shell-\u6539\u56de-bash\">\u5c07\u9810\u8a2d shell \u6539\u56de bash<\/h3>\n<p>\u82e5\u8981\u5c07\u9810\u8a2d shell \u5f9e Zsh \u6539\u56de bash\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>chsh <span class=\"nt\">-s<\/span> \/bin\/bash\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u521d\u59cb\u5316\u8a2d\u5b9a\">\u521d\u59cb\u5316\u8a2d\u5b9a<\/h2>\n<p>\u5c07\u9810\u8a2d shell \u8a2d\u5b9a\u70ba Zsh \u4e26\u91cd\u65b0\u8f09\u5165\uff0c\u6216\u4f7f\u7528 <code class=\"highlighter-rouge\">zsh<\/code> \u6307\u4ee4\u9032\u5165 Zsh \u5f8c\uff0c\u7b2c\u4e00\u6b21\u6703\u770b\u5230 zsh-newuser-install \u7684\u521d\u59cb\u5316\u8a2d\u5b9a\u756b\u9762\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>This is the Z Shell configuration function for new users,\nzsh-newuser-install.\nYou are seeing this message because you have no zsh startup files\n(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory\n~).  This function can help you with a few settings that should\nmake your use of the shell easier.\n\nYou can:\n\n(q)  Quit and do nothing.  The function will be run again next time.\n\n(0)  Exit, creating the file ~\/.zshrc containing just a comment.\n     That will prevent this function being run again.\n\n(1)  Continue to the main menu.\n\n--- Type one of the keys in parentheses ---\n\n<\/code><\/pre><\/div><\/div>\n\n<p>zsh-newuser-install \u53ef\u4ee5\u5354\u52a9\u8a2d\u5b9a\u4e26\u7522\u751f .zshrc \u8a2d\u5b9a\u6a94\uff0c\u9019\u88e1\u6211\u5011\u5148\u9078\u64c7 0\uff1a\u50c5\u5efa\u7acb\u4f46\u4e0d\u8a2d\u5b9a .zshrc\uff0c\u7a0d\u5f8c\u7531 Oh My Zsh \u6216\u662f Antigen \u4f86\u5354\u52a9\u8a2d\u5b9a Zsh\u3002<\/p>\n\n<p>\u82e5\u4e4b\u5f8c\u60f3\u91cd\u65b0\u900f\u904e zsh-newuser-install \u8a2d\u5b9a Zsh\uff0c\u5247\u53ef\u5728\u5099\u5206 .zshrc \u8a2d\u5b9a\u6a94\u5f8c\uff0c\u57f7\u884c\u4ee5\u4e0b\u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>autoload <span class=\"nt\">-U<\/span> zsh-newuser-install<span class=\"p\">;<\/span> zsh-newuser-install <span class=\"nt\">-f<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"oh-my-zsh\">Oh My Zsh<\/h2>\n<p>Zsh \u6709\u8c50\u5bcc\u7684 plug-in \u8cc7\u6e90\uff0c\u53ef\u4ee5\u5927\u5e45\u64f4\u5145 Zsh \u7684\u529f\u80fd\u3002\u4f46\u773e\u591a\u7684 plug-in \u7ba1\u7406\u8d77\u4f86\uff0c\u4e0d\u8ad6\u662f\u5b89\u88dd\u3001\u66f4\u65b0\u6216\u79fb\u9664\u90fd\u76f8\u7576\u9ebb\u7169\u3002\u6211\u5011\u53ef\u4ee5\u501f\u52a9 Zsh \u7d44\u614b\u6846\u67b6\u2014\u2014<a href=\"http:\/\/ohmyz.sh\/\">Oh My Zsh<\/a> \u4f86\u7c21\u5316\u63d2\u4ef6\u8207\u76f8\u95dc\u8a2d\u5b9a\u7684\u7ba1\u7406\u3002<\/p>\n\n<p>\u4f9d\u64da <a href=\"https:\/\/github.com\/robbyrussell\/oh-my-zsh\">Oh My Zsh \u7684 GitHub<\/a> \u8aaa\u660e\uff0c\u57f7\u884c\u4ee5\u4e0b\u6307\u4ee4\u4f86\u5b89\u88dd\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>sh <span class=\"nt\">-c<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">$(<\/span>curl <span class=\"nt\">-fsSL<\/span> https:\/\/raw.githubusercontent.com\/robbyrussell\/oh-my-zsh\/master\/tools\/install.sh<span class=\"k\">)<\/span><span class=\"s2\">\"<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"theme\">Theme<\/h3>\n<p>Oh My Zsh \u5167\u5efa\u4e86\u591a\u7a2e\u4f48\u666f\u4e3b\u984c\uff0c\u9810\u8a2d\u70ba robbyrussell\u3002\u82e5\u8981\u66f4\u6539\uff0c\u53ef\u4ee5\u4fee\u6539 .zshrc\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>ZSH_THEME=\"[theme]\"\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5b89\u88dd\u7b2c\u4e09\u65b9\u7684 Theme \u5247\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9a5f\uff1a<\/p>\n\n<ol>\n  <li>\u4e0b\u8f09\u4f48\u666f\u4e3b\u984c\uff08\u5efa\u8b70\u4f7f\u7528 <code class=\"highlighter-rouge\">git clone<\/code>\uff09\u81f3 <code class=\"highlighter-rouge\">$ZSH_CUSTOM\/themes\/<\/code>\uff08\u8b8a\u6578 <code class=\"highlighter-rouge\">$ZSH_CUSTOM<\/code> \u6703\u6307\u5411 ~\/.oh-my-zsh\/custom\uff09<\/li>\n  <li>\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">ZSH_THEME<\/code><\/li>\n<\/ol>\n\n<h4 id=\"powerlevel9k\">powerlevel9k<\/h4>\n<p>\u56e0\u70ba <a href=\"https:\/\/github.com\/bhilburn\/powerlevel9k\">Powerlevel9k<\/a> \u4e3b\u984c\u4f7f\u7528\u4e86 Powerline \u5b57\u578b\uff0c\u6211\u5011\u5148\u5b89\u88dd <a href=\"https:\/\/github.com\/ryanoasis\/nerd-fonts\">Nerd Fonts<\/a> \u5b57\u578b\uff08\u4ee5 Knack Nerd Font \u70ba\u4f8b\uff09\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew cask install font-hack-nerd-font\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4e0b\u8f09 Powerlevel9k\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>git clone https:\/\/github.com\/bhilburn\/powerlevel9k.git <span class=\"nv\">$ZSH_CUSTOM<\/span>\/themes\/powerlevel9k\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">ZSH_THEME<\/code>\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>ZSH_THEME=\"powerlevel9k\/powerlevel9k\"\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4e26\u65bc .zshrc \u4e2d\u52a0\u5165\u4ee5\u4e0b\u8a2d\u5b9a\u4f86\u958b\u555f Powerlevel9k \u4e3b\u984c\u5c0d Nerd Fonts \u5b57\u578b\u7684\u652f\u63f4\uff08\u9808\u5728\u5957\u7528\u4e3b\u984c\u8a2d\u5b9a\u4e4b\u524d\uff09\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>POWERLEVEL9K_MODE='nerdfont-complete'\n<\/code><\/pre><\/div><\/div>\n\n<p>\u91cd\u65b0\u8f09\u5165 Zsh \u8a2d\u5b9a\u6a94\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> ~\/.zshrc\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4ee5\u53ca\u5728 iTerm2 \u4e2d\u8a2d\u5b9a\u597d\u4f7f\u7528 Knack Nerd Font \u5b57\u578b\u3002<\/p>\n\n<h3 id=\"plug-ins\">Plug-ins<\/h3>\n<p>Oh My Zsh \u7684\u5957\u4ef6\u5b89\u88dd\u65b9\u5f0f\u53ef\u4f9d\u4ee5\u4e0b\u6b65\u9a5f\uff1a<\/p>\n\n<ol>\n  <li>Plug-in \u5206\u70ba Oh My Zsh \u5167\u5efa\u3001\u6216\u662f\u81ea\u884c\u4e0b\u8f09\n    <ul>\n      <li><strong>\u5167\u5efa\u4e4b plug-in\uff1a<\/strong>\u7121\u9808\u984d\u5916\u7684\u4e0b\u8f09\u64cd\u4f5c<\/li>\n      <li><strong>\u81ea\u884c\u4e0b\u8f09\u4e4b plug-in\uff1a<\/strong>\u5c07 plug-in \u4e0b\u8f09\uff08\u5efa\u8b70\u4f7f\u7528 <code class=\"highlighter-rouge\">git clone<\/code>\uff09\u81f3 <code class=\"highlighter-rouge\">$ZSH_CUSTOM\/plugins\/<\/code>\uff08\u8b8a\u6578 <code class=\"highlighter-rouge\">$ZSH_CUSTOM<\/code> \u6703\u6307\u5411 ~\/.oh-my-zsh\/custom\uff09<\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <p>\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code>\uff1a<\/p>\n\n    <div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code> plugins=(\u2026 [plugin])\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\n    <p>\u91cd\u65b0\u8f09\u5165 Zsh \u8a2d\u5b9a\u6a94\uff1a<\/p>\n\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code> <span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> ~\/.zshrc\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ol>\n\n<h3 id=\"nvm\">NVM<\/h3>\n<h4 id=\"\u4f7f\u7528-homebrew-\u5b89\u88dd\">\u4f7f\u7528 Homebrew \u5b89\u88dd<\/h4>\n<p><strong>Homebrew \u4e0a\u7684\u7248\u672c\u5df2\u4e0d\u5728\u7dad\u8b77\uff0c\u4e0d\u5efa\u8b70\u4f7f\u7528\u6b64\u65b9\u5f0f\u5b89\u88dd\u3002<\/strong><\/p>\n\n<p>Oh My Zsh \u5167\u5efa\u5c0d <a href=\"https:\/\/github.com\/creationix\/nvm\">NVM<\/a> \u7684\u652f\u63f4\uff0c\u9996\u5148\u9084\u662f\u8981\u5b89\u88dd\u597d NVM\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install nvm\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u65bc\u4f7f\u7528\u8005\u5bb6\u76ee\u9304\u4e0b\u5efa\u7acb .nvm \u8cc7\u6599\u593e\uff0c\u4ee5\u53ca\u6307\u5411 NVM \u5b89\u88dd\u8def\u5f91\u7684 symbolic link\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>$ mkdir ~\/.nvm\n$ ln -s $(brew --prefix nvm)\/nvm.sh ~\/.nvm\/nvm.sh\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165 nvm\u3002<\/p>\n\n<h4 id=\"\u900f\u904e-zsh-nvm-\u5b89\u88dd\">\u900f\u904e zsh-nvm \u5b89\u88dd<\/h4>\n<p><strong>\u7531\u65bc nvm \u5df2\u4e0d\u7e7c\u7e8c\u652f\u63f4\u900f\u904e Homebrew \u7684\u5b89\u88dd\u65b9\u5f0f<\/strong>\uff0c\u56e0\u6b64\u6211\u5011\u4f7f\u7528 <a href=\"https:\/\/github.com\/lukechilds\/zsh-nvm\">zsh-nvm<\/a> \u4f86\u5b89\u88dd\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>git clone https:\/\/github.com\/lukechilds\/zsh-nvm <span class=\"nv\">$ZSH_CUSTOM<\/span>\/plugins\/zsh-nvm\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165 zsh-nvm\u3002<\/p>\n\n<h3 id=\"z\">z<\/h3>\n<p>Oh My Zsh \u5167\u5efa\u5c0d <a href=\"https:\/\/github.com\/rupa\/z\">Z<\/a> \u7684\u652f\u63f4\uff0c\u9996\u5148\u9084\u662f\u8981\u5b89\u88dd\u597d Z\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install z\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165 z\u3002<\/p>\n\n<!--### zsh-completions\n```bash\n$ git clone https:\/\/github.com\/zsh-users\/zsh-completions $ZSH_CUSTOM\/plugins\/zsh-completions\n$ autoload -U compinit && compinit\n```-->\n\n<!--### npm\n\u63d0\u4f9b npm \u6307\u4ee4\u7684\u63d0\u793a\uff0c\u9808\u8981\u5148\u5b89\u88dd\u597d npm \u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 `plugins` \u52a0\u5165 npm\u3002-->\n\n<h3 id=\"zsh-autosuggestions\">zsh-autosuggestions<\/h3>\n<p><a href=\"https:\/\/github.com\/zsh-users\/zsh-autosuggestions\">zsh-autosuggestions<\/a> \u662f\u4e00\u500b\u63d0\u4f9b\u6307\u4ee4\u63d0\u793a\u529f\u80fd\u7684 plug-in\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>git clone git:\/\/github.com\/zsh-users\/zsh-autosuggestions <span class=\"nv\">$ZSH_CUSTOM<\/span>\/plugins\/zsh-autosuggestions\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165 zsh-autosuggestions\u3002<\/p>\n\n<p>\u5982\u679c iTerm2 \u4f7f\u7528\u4e86\u6697\u8272\u8abf\u7684\u914d\u8272\uff0c\u53ef\u80fd\u6703\u770b\u4e0d\u5230\u81ea\u52d5\u63d0\u793a\u3002\u53ef\u4ee5\u57f7\u884c\u4ee5\u4e0b\u6307\u4ee4\u4fee\u6539\u63d0\u793a\u5b57\u984f\u8272\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=10'\"<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.zshrc\n<span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> ~\/.zshrc\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"zsh-syntax-highlighting\">zsh-syntax-highlighting<\/h3>\n<p><a href=\"https:\/\/github.com\/zsh-users\/zsh-syntax-highlighting\">zsh-syntax-highlighting<\/a> \u662f\u4e00\u500b\u63d0\u4f9b\u8a9e\u6cd5\u9ad8\u4eae\uff08syntax highlighting\uff09\u529f\u80fd\u7684 plug-in\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>git clone https:\/\/github.com\/zsh-users\/zsh-syntax-highlighting.git <span class=\"nv\">$ZSH_CUSTOM<\/span>\/plugins\/zsh-syntax-highlighting\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165 zsh-syntax-highlighting\u3002<\/p>\n\n<!--### zsh-history-substring-search\n```bash\n$ git clone https:\/\/github.com\/zsh-users\/zsh-history-substring-search $ZSH_CUSTOM\/plugins\/zsh-history-substring-search\n```-->\n\n<!--### history-search-multi-word\n[history-search-multi-word](https:\/\/github.com\/zdharma\/history-search-multi-word) \u662f\u4e00\u500b\u63d0\u4f9b\u4ee5\u96a8\u6253\u5373\u627e\u7684\u65b9\u5f0f\u4f86\u641c\u5c0b\u6307\u4ee4\u6b77\u53f2\u64cd\u4f5c\u7684 plug-in\uff1a\n\n```bash\n$ git clone https:\/\/github.com\/zdharma\/history-search-multi-word.git $ZSH_CUSTOM\/plugins\/history-search-multi-word\n```\n\n\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 `plugins` \u52a0\u5165 history-search-multi-word\u3002-->\n\n<h3 id=\"bd\">bd<\/h3>\n<p><a href=\"https:\/\/github.com\/Tarrasch\/zsh-bd\">bd<\/a> \u662f\u4e00\u500b\u63d0\u4f9b\u76f4\u63a5\u8df3\u81f3\u76ee\u524d\u6240\u5728\u8def\u5f91\u7684\u7279\u5b9a\u540d\u7a31\u4e4b\u7236\u76ee\u9304\u7684 plug-in\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>git clone https:\/\/github.com\/Tarrasch\/zsh-bd.git <span class=\"nv\">$ZSH_CUSTOM<\/span>\/plugins\/bd\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165 bd\u3002<\/p>\n\n<h3 id=\"fzf\">fzf<\/h3>\n<p><a href=\"https:\/\/github.com\/junegunn\/fzf\">fzf<\/a> \u662f\u4e00\u500b\u6a21\u7cca\u641c\u5c0b\u5de5\u5177\uff0c\u53ef\u4ee5\u8f38\u5165\u95dc\u9375\u5b57\u7684\u65b9\u5f0f\u5c0b\u627e\u6a94\u6848\u6216\u76ee\u9304\u3002fzf \u4e0d\u662f Zsh \u7684 plug-in\uff0c\u4f46\u70ba\u8a31\u591a\u96a8\u6253\u5373\u627e\u5de5\u5177\u7684\u76f8\u4f9d\u5957\u4ef6\u3002<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install fzf\n<\/code><\/pre><\/div><\/div>\n\n<p>\u63a5\u8457\u5b89\u88dd fzf \u7684 key bindings \u53ca fuzzy completion \u529f\u80fd\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"k\">$(<\/span>brew <span class=\"nt\">--prefix<\/span><span class=\"k\">)<\/span>\/opt\/fzf\/install\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5b89\u88dd\u5f8c\u6703\u65bc .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u65b0\u589e\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">[<\/span> <span class=\"nt\">-f<\/span> ~\/.fzf.zsh <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">source<\/span> ~\/.fzf.zsh\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"zsh-interactive-cd\">zsh-interactive-cd<\/h3>\n<p><a href=\"https:\/\/github.com\/changyuheng\/zsh-interactive-cd\">zsh-interactive-cd<\/a> \u662f\u4e00\u500b\u63d0\u4f9b\u4ee5\u96a8\u6253\u5373\u627e\u7684\u65b9\u5f0f\u4f86\u5207\u63db\u76ee\u9304\u7684 plug-in\u3002<\/p>\n\n<p>\u203b\u9808\u8981\u5148\u5b89\u88dd <a href=\"#fzf\">fzf<\/a><\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>git clone https:\/\/github.com\/changyuheng\/zsh-interactive-cd.git <span class=\"nv\">$ZSH_CUSTOM<\/span>\/plugins\/zsh-interactive-cd\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165 zsh-interactive-cd\u3002<\/p>\n\n<h3 id=\"fz\">fz<\/h3>\n<p><a href=\"https:\/\/github.com\/changyuheng\/fz\">fz<\/a> \u662f\u4e00\u500b\u63d0\u4f9b\u4ee5\u96a8\u6253\u5373\u627e\u7684\u65b9\u5f0f\u81ea\u6b77\u53f2\u76ee\u9304\u4e2d\u5207\u63db\u7684 plug-in\u3002<\/p>\n\n<p>\u203b\u9808\u8981\u5148\u5b89\u88dd <a href=\"#fzf\">fzf<\/a> \u4ee5\u53ca <a href=\"#z\">z<\/a><\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>git clone https:\/\/github.com\/changyuheng\/fz.git <span class=\"nv\">$ZSH_CUSTOM<\/span>\/plugins\/fz\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4fee\u6539 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165 fz\u3002<\/p>\n\n<h2 id=\"antigen\">Antigen<\/h2>\n<p>\u9664\u4e86\u76f4\u63a5\u4f7f\u7528 Oh My Zsh \u4f86\u7ba1\u7406 Zsh \u63d2\u4ef6\u5916\uff0c\u53e6\u4e00\u500b\u9078\u64c7\u662f\u900f\u904e <a href=\"https:\/\/github.com\/zsh-users\/antigen\">Antigen<\/a>\u3002<\/p>\n\n<p>Antigen \u662f\u4e00\u500b Zsh \u7684 plug-in \u7ba1\u7406\u5de5\u5177\uff0c\u53ef\u4ee5\u53ea\u900f\u904e\u8a2d\u5b9a\u6a94\u7684\u65b9\u5f0f\u4f86\u7ba1\u7406\u6240\u6709\u63d2\u4ef6\u3002\u4e0d\u7528\u81ea\u5df1\u4e0b\u8f09\u3001\u66f4\u65b0 plug-in\uff0c\u751a\u81f3\u80fd\u628a Oh My Zsh \u4e5f\u7576\u4f5c\u63d2\u4ef6\u4f86\u7ba1\u7406\u3002<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install antigen\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u4f7f\u7528-antigen-\u7ba1\u7406-zsh-plug-ins\">\u4f7f\u7528 Antigen \u7ba1\u7406 Zsh Plug-ins<\/h3>\n<p>\u4ee5\u4e0a\u9762\u6240\u5217\u7684\u63d2\u4ef6\u70ba\u4f8b\uff0c\u7de8\u8f2f .zshrc \u8a2d\u5b9a\u6a94\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code># \u958b\u555f Powerlevel9k \u4e3b\u984c\u5c0d Nerd Fonts \u5b57\u578b\u7684\u652f\u63f4\nPOWERLEVEL9K_MODE='nerdfont-complete'\n\n# \u8f09\u5165 Antigen\nsource \/usr\/local\/share\/antigen\/antigen.zsh\n\n# \u900f\u904e Antigen \u4f86\u4f7f\u7528 Oh My Zsh\nantigen use oh-my-zsh\n\n# \u900f\u904e Antigen \u8f09\u5165 Oh My Zsh \u5167\u5efa theme\n# antigen theme robbyrussell\n\n# \u900f\u904e Antigen \u4f7f\u7528\u5176\u4ed6 Zsh theme\nantigen theme bhilburn\/powerlevel9k\n\n# \u900f\u904e Antigen \u4f7f\u7528 Oh My Zsh \u5167\u5efa plug-ins\nantigen bundle git\nantigen bundle z\n\n# \u900f\u904e Antigen \u4f7f\u7528\u5176\u4ed6 Zsh plug-ins\nantigen bundle lukechilds\/zsh-nvm\nantigen bundle zsh-users\/zsh-autosuggestions\nantigen bundle zsh-users\/zsh-syntax-highlighting\nantigen bundle Tarrasch\/zsh-bd\nantigen bundle changyuheng\/zsh-interactive-cd\nantigen bundle changyuheng\/fz\n\n# \u5957\u7528 Antigen \u8a2d\u5b9a\nantigen apply\n\n# \u4fee\u6539\u63d0\u793a\u5b57\u984f\u8272\nZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=10'\n<\/code><\/pre><\/div><\/div>\n\n<p>\u53ea\u8981 Zsh \u8a2d\u5b9a\u6a94\u6709\u7570\u52d5\uff0c\u5fc5\u9808\u4f7f\u7528\u4ee5\u4e0b\u6307\u4ee4\u4f86\u8b93 Antigen \u8f09\u5165\u65b0\u7684\u8a2d\u5b9a\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>antigen reset\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u91cd\u65b0\u8f09\u5165 Zsh\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>zsh\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u5e38\u7528\u6307\u4ee4\">\u5e38\u7528\u6307\u4ee4<\/h3>\n\n<table>\n  <thead>\n    <tr>\n      <th>\u6307\u4ee4<\/th>\n      <th>\u8aaa\u660e<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td><code class=\"highlighter-rouge\">antigen help<\/code><\/td>\n      <td>Antigen \u4f7f\u7528\u8aaa\u660e<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">antigen reset<\/code><\/td>\n      <td>\u6e05\u9664\u5feb\u53d6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">antigen list<\/code><\/td>\n      <td>\u67e5\u770b\u5df2\u5b89\u88dd\u7684 Zsh Plug-in<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">antigen update<\/code><\/td>\n      <td>\u66f4\u65b0\u6240\u6709 Zsh Plug-in<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">antigen update [plugin]<\/code><\/td>\n      <td>\u66f4\u65b0\u6307\u5b9a Zsh Plug-in<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">antigen cleanup<\/code><\/td>\n      <td>\u6e05\u9664\u672a\u4f7f\u7528 Zsh Plug-in \u7684 Git Repo<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">antigen purge [plugin]<\/code><\/td>\n      <td>\u79fb\u9664 Zsh Plug-in<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"https:\/\/github.com\/robbyrussell\/oh-my-zsh\/wiki\/Plugins\">Oh My Zsh - Plugins<\/a><\/li>\n  <li><a href=\"https:\/\/github.com\/robbyrussell\/oh-my-zsh\/wiki\/External-plugins\">Oh My Zsh - External plugins<\/a><\/li>\n  <li><a href=\"https:\/\/github.com\/robbyrussell\/oh-my-zsh\/wiki\/themes\">Oh My Zsh - Themes<\/a><\/li>\n  <li><a href=\"https:\/\/github.com\/robbyrussell\/oh-my-zsh\/wiki\/External-themes\">Oh My Zsh - External themes<\/a><\/li>\n  <li><a href=\"https:\/\/github.com\/bhilburn\/powerlevel9k\/wiki\/Install-Instructions\">Powerlevel9k - Install Instructions<\/a><\/li>\n  <li><a href=\"https:\/\/github.com\/zsh-users\/antigen\/wiki\/Commands\">Antigen - Commands<\/a><\/li>\n<\/ul>\n","pubDate":"Wed, 25 Oct 2017 00:00:00 +0000"},{"title":"macOS CLI \u74b0\u5883\u5efa\u7f6e\uff1aHomebrew\u3001iTerm2","link":"\/2017\/10\/25\/improve-macos-cli-homebrew-iterm2.html","guid":"\/2017\/10\/25\/improve-macos-cli-homebrew-iterm2.html","description":"<p>\u7531\u65bc\u8981\u628a\u81ea\u5df1\u7684 Macbook Pro \u5347\u7d1a\u5230 macOS 10.13 High Sierra\uff0c\u8d81\u8457\u4e7e\u6de8\u5b89\u88dd\u7cfb\u7d71\u7684\u6a5f\u6703\u4e5f\u5c07\u81ea\u5df1\u611b\u7528\u7684 Command Line Interface \u74b0\u5883\u5efa\u7f6e\u6b65\u9a5f\u8a18\u9304\u4e0b\u4f86\u200c\uff5e<\/p>\n\n<h2 id=\"homebrew\">Homebrew<\/h2>\n<p><a href=\"https:\/\/brew.sh\/\">Homebrew<\/a> \u662f macOS \u4e0b\u77e5\u540d\u7684\u5957\u4ef6\u7ba1\u7406\u5de5\u5177\uff08<a href=\"https:\/\/en.wikipedia.org\/wiki\/Package_manager\">package manager<\/a>\uff09\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e Homebrew \u4f86\u5b89\u88dd\u3001\u7ba1\u7406\u773e\u591a CLI \u4e0b\u7684\u6307\u4ee4\u5de5\u5177\u3002<\/p>\n\n<h3 id=\"\u5b89\u88dd\u65b9\u5f0f\">\u5b89\u88dd\u65b9\u5f0f<\/h3>\n<ul>\n  <li>\u4f9d <a href=\"https:\/\/brew.sh\/index_zh-tw.html\">Homebrew \u5b98\u7db2<\/a>\u8aaa\u660e\uff0c\u5c07\u5b89\u88dd\u6307\u4ee4\u8cbc\u81f3\u7d42\u7aef\u6a5f\u4e2d<\/li>\n  <li>Homebrew \u6703\u7528\u5230 <a href=\"https:\/\/developer.apple.com\/xcode\/\">Xcode<\/a> \u7684 Command Line Tools\uff0c\u4e26\u6703\u5728\u5b89\u88dd\u904e\u7a0b\u4e2d\u81ea\u52d5\u4e0b\u8f09 Command Line Tools<\/li>\n<\/ul>\n\n<h3 id=\"\u4f7f\u7528\u65b9\u5f0f\u53ca\u5e38\u7528\u6307\u4ee4\">\u4f7f\u7528\u65b9\u5f0f\u53ca\u5e38\u7528\u6307\u4ee4<\/h3>\n<p>\u56e0\u70ba Homebrew \u53ca\u5176\u4e2d\u7684\u5957\u4ef6\u6e05\u55ae\u66f4\u65b0\u76f8\u7576\u5feb\u901f\uff0c\u6240\u4ee5\u901a\u5e38\u5728\u8981\u5c0b\u627e\u6216\u5b89\u88dd\u5957\u4ef6\u524d\u90fd\u6703\u5148\u900f\u904e <code class=\"highlighter-rouge\">brew update<\/code> \u6307\u4ee4\u4f86\u66f4\u65b0 Homebrew \u4ee5\u53ca\u5957\u4ef6\u6e05\u55ae\u3002<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>\u6307\u4ee4<\/th>\n      <th>\u8aaa\u660e<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew help<\/code><\/td>\n      <td>Homebrew \u4f7f\u7528\u8aaa\u660e<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew help [command]<\/code><\/td>\n      <td>\u67e5\u770b Homebrew \u6307\u4ee4\u8aaa\u660e<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew update<\/code><\/td>\n      <td>\u53d6\u5f97\u6700\u65b0\u7248\u672c\u7684 Homebrew \u53ca\u5957\u4ef6\u6e05\u55ae<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew list<\/code><\/td>\n      <td>\u6aa2\u8996\u5df2\u5b89\u88dd\u5957\u4ef6\u6e05\u55ae<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew info<\/code><\/td>\n      <td>\u67e5\u770b\u6240\u6709\u5df2\u5b89\u88dd\u5957\u4ef6\u8cc7\u8a0a<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew info [formulae]<\/code><\/td>\n      <td>\u6aa2\u8996\u5957\u4ef6\u8cc7\u8a0a<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew search [formulae]<\/code><\/td>\n      <td>\u641c\u5c0b\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew install [formulae]<\/code><\/td>\n      <td>\u5b89\u88dd\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew uninstall [formulae]<\/code><\/td>\n      <td>\u79fb\u9664\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew outdated<\/code><\/td>\n      <td>\u6aa2\u67e5\u904e\u671f\uff08\u5df2\u6709\u65b0\u7248\uff09\u7684\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew upgrade<\/code><\/td>\n      <td>\u66f4\u65b0\u6240\u6709\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew upgrade [formulae]<\/code><\/td>\n      <td>\u66f4\u65b0\u6307\u5b9a\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew --prefix<\/code><\/td>\n      <td>\u6aa2\u8996 Homebrew \u5957\u4ef6\u5b89\u88dd\u8def\u5f91<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew --prefix [formulae]<\/code><\/td>\n      <td>\u6aa2\u8996\u5957\u4ef6\u65bc cellar \u7684\u8def\u5f91<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew link<\/code><\/td>\n      <td>\u70ba\u6240\u6709\u5df2\u5b89\u88dd\u7684\u5957\u4ef6\u5efa\u7acb symbolic link \u6307\u5411\u5957\u4ef6\u5b89\u88dd\u8def\u5f91<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew unlink [formulae]<\/code><\/td>\n      <td>\u79fb\u9664\u5957\u4ef6\u7684 symbolic link<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew prune<\/code><\/td>\n      <td>\u79fb\u9664\u6240\u6709\u6307\u5411 Homebrew \u5957\u4ef6\u5b89\u88dd\u8def\u5f91\u7684\u5931\u6548 symbolic link<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cleanup<\/code><\/td>\n      <td>\u79fb\u9664\u820a\u7248\u672c\u7684\u5957\u4ef6\u6a94\u6848<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew --cache<\/code><\/td>\n      <td>\u6aa2\u8996 Homebrew \u4e0b\u8f09\u5feb\u53d6\u8def\u5f91<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew --cache [formulae]<\/code><\/td>\n      <td>\u6aa2\u8996 Homebrew \u5957\u4ef6\u4e0b\u8f09\u5feb\u53d6\u6a94\u6848\u8def\u5f91<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2 id=\"homebrew-cask\">Homebrew-Cask<\/h2>\n<p><a href=\"https:\/\/caskroom.github.io\/\">Homebrew-Cask<\/a> \u662f\u5229\u7528 Homebrew <a href=\"https:\/\/docs.brew.sh\/brew-tap.html\">\u7b2c\u4e09\u65b9\u5957\u4ef6\u5eab<\/a>\u4ee5\u53ca<a href=\"https:\/\/docs.brew.sh\/External-Commands.html\">\u5916\u90e8\u6307\u4ee4<\/a>\u7684\u65b9\u5f0f\u4f86\u64f4\u5145\u3001\u589e\u52a0 Homebrew \u5b89\u88dd\u7ba1\u7406 GUI \u8996\u7a97\u7a0b\u5f0f\u6216\u5176\u4ed6\u8cc7\u6e90\u5957\u4ef6\u7684\u80fd\u529b\u3002<\/p>\n\n<h3 id=\"\u5b89\u88dd\u65b9\u5f0f-1\">\u5b89\u88dd\u65b9\u5f0f<\/h3>\n<p>Homebrew-Cask \u7531 <code class=\"highlighter-rouge\">brew tap [user\/repo]<\/code> \u5c07\u5957\u4ef6\u5eab\u52a0\u81f3 Homebrew \u4e2d\uff08\u5fc5\u9808\u5b89\u88dd Homebrew\uff09\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew tap caskroom\/cask\n<\/code><\/pre><\/div><\/div>\n\n<h4 id=\"caskroom-fonts\">Caskroom-fonts<\/h4>\n<p>Homebrew-Cask \u9084\u6709\u63d0\u4f9b<a href=\"https:\/\/github.com\/caskroom\/homebrew-fonts\">\u5b57\u578b\u5957\u4ef6\u5eab<\/a>\uff0c\u82e5\u8981\u4f7f\u7528\u53ef\u5c07\u5957\u4ef6\u5eab\u5c07\u52a0\u5165 Homebrew\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew tap caskroom\/fonts\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u4f7f\u7528\u65b9\u5f0f\u53ca\u5e38\u7528\u6307\u4ee4-1\">\u4f7f\u7528\u65b9\u5f0f\u53ca\u5e38\u7528\u6307\u4ee4<\/h3>\n<p>\u548c Homebrew \u76f8\u540c\uff0c\u8981\u4f7f\u7528 Homebrew-Cask \u5c0b\u627e\u6216\u5b89\u88dd\u5957\u4ef6\u524d\u90fd\u6703\u5148\u900f\u904e <code class=\"highlighter-rouge\">brew update<\/code> \u6307\u4ee4\u4f86\u66f4\u65b0 Homebrew-Cask \u4ee5\u53ca\u5957\u4ef6\u6e05\u55ae\u3002<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>\u6307\u4ee4<\/th>\n      <th>\u8aaa\u660e<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cask help<\/code><\/td>\n      <td>Homebrew-Cask \u4f7f\u7528\u8aaa\u660e<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cask list<\/code><\/td>\n      <td>\u6aa2\u8996\u5df2\u5b89\u88dd\u5957\u4ef6\u6e05\u55ae<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cask info [formulae]<\/code><\/td>\n      <td>\u6aa2\u8996\u5957\u4ef6\u8cc7\u8a0a<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cask search [formulae]<\/code><\/td>\n      <td>\u641c\u5c0b\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cask install [formulae]<\/code><\/td>\n      <td>\u5b89\u88dd\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cask uninstall [formulae]<\/code><\/td>\n      <td>\u79fb\u9664\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cask outdated<\/code><\/td>\n      <td>\u6aa2\u67e5\u904e\u671f\uff08\u5df2\u6709\u65b0\u7248\uff09\u7684\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">brew cask cleanup<\/code><\/td>\n      <td>\u79fb\u9664\u4e0b\u8f09\u5957\u4ef6\u7684\u5feb\u53d6\u6a94\u6848<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<p>\u203bHomebrew-Cask \u70ba Homebrew \u7684 <a href=\"https:\/\/docs.brew.sh\/External-Commands.html\">External Commands<\/a>\uff0c\u6240\u4ee5\u4f7f\u7528 <code class=\"highlighter-rouge\">brew cask<\/code> \u76f8\u95dc\u6307\u4ee4\u4fbf\u6703\u81ea \/usr\/local\/Homebrew\/Library\/Homebrew\/cask \u4e2d\u5c0b\u627e Homebrew-Cask \u7684\u6307\u4ee4\u4f86\u57f7\u884c\u3002<\/p>\n\n<h2 id=\"iterm2\">iTerm2<\/h2>\n<p><a href=\"https:\/\/www.iterm2.com\/\">iTemr2<\/a> \u662f\u4e00\u5957\u53ef\u4ee5\u53d6\u4ee3 macOS \u7cfb\u7d71\u5167\u5efa Terminal App \u7684\u7d42\u7aef\u6a5f\u5de5\u5177\uff0c\u5b83\u6709\u4f48\u666f\u4e3b\u984c\u7b49\u529f\u80fd\u53ef\u4ee5\u5e6b\u52a9\u6211\u5011\u5728 CLI \u74b0\u5883\u4e0b\u5de5\u4f5c\u6642\u80fd\u66f4\u52a0\u65b9\u4fbf\u3001\u6709\u6548\u7387\u7684\u64cd\u4f5c\u6307\u4ee4\u4f86\u5b8c\u6210\u76ee\u6a19\u3002<\/p>\n\n<h3 id=\"\u5b89\u88dd-iterm2\">\u5b89\u88dd iTerm2<\/h3>\n<p>\u4f7f\u7528 Homebrew-Cask \u5b89\u88dd iTerm2\uff1a<\/p>\n\n<pre><code class=\"language-bask\">$ brew cask install iterm2\n<\/code><\/pre>\n\n<h3 id=\"\u8a2d\u5b9a\u986f\u793a\u914d\u8272\">\u8a2d\u5b9a\u986f\u793a\u914d\u8272<\/h3>\n<p>iTerm2 \u9810\u8a2d\u7684\u80cc\u666f\u914d\u8272\u662f\u6f06\u9ed1\u7684 Dark Background\uff0c\u8981\u4fee\u6539\u6210\u559c\u6b61\u7684\u914d\u8272\u53ef\u4ee5\u5f9e\u9078\u55ae\u5217\uff1a<\/p>\n\n<ul>\n  <li>iTerm2 -&gt; Preferences -&gt; Profiles -&gt; Colors<\/li>\n<\/ul>\n\n<p>\u9078\u64c7 Color Presets\u2026 \u70ba\u8981\u5957\u7528\u7684\u5167\u5efa\u914d\u8272\u7d44\u5408\uff0c\u6211\u611b\u7528\u7684\u662f Solarized Dark\u3002<\/p>\n\n<h3 id=\"\u8a2d\u5b9a\u986f\u793a\u5b57\u578b\">\u8a2d\u5b9a\u986f\u793a\u5b57\u578b<\/h3>\n<p>\u8981\u66f4\u6539\u986f\u793a\u5b57\u578b\u53ef\u4ee5\u5f9e\u9078\u55ae\u5217\uff1a<\/p>\n\n<ul>\n  <li>iTerm2 -&gt; Preferences -&gt; Profiles -&gt; Text<\/li>\n<\/ul>\n\n<p>\u9ede\u64ca Change Font \u6309\u9215\u66f4\u6539\u5b57\u578b\u3002<\/p>\n\n<h3 id=\"\u958b\u555f-word-jumps\">\u958b\u555f Word Jumps<\/h3>\n<p>\u8981\u900f\u904e\u4ee5\u4e0b\u7d44\u5408\u9375\u9032\u884c\u55ae\u5b57\u8df3\u8e8d\uff1a<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>\u7d44\u5408\u9375<\/th>\n      <th>\u7d44\u5408\u9375<\/th>\n      <th>\u8aaa\u660e<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td><kbd>\u2325<\/kbd> + <kbd>F<\/kbd><\/td>\n      <td><kbd>\u2325<\/kbd> + <kbd>\u2192<\/kbd><\/td>\n      <td>\u5411\u524d\uff08\u53f3\uff09\u8df3\u8e8d\u4e00\u500b\u55ae\u5b57<\/td>\n    <\/tr>\n    <tr>\n      <td><kbd>\u2325<\/kbd> + <kbd>B<\/kbd><\/td>\n      <td><kbd>\u2325<\/kbd> + <kbd>\u2190<\/kbd><\/td>\n      <td>\u5411\u5f8c\uff08\u5de6\uff09\u8df3\u8e8d\u4e00\u500b\u55ae\u5b57<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<p>\u9808\u8981\u5148\u958b\u555f Word Jumps\uff0c\u5f9e\u9078\u55ae\u5217\uff1a<\/p>\n\n<ul>\n  <li>iTerm2 -&gt; Preferences -&gt; Profiles -&gt; Keys<\/li>\n<\/ul>\n\n<p>\u5c07\u5de6 <kbd>\u2325<\/kbd> \u8a2d\u5b9a\u70ba +Esc\uff0c\u9078\u9805\u70ba\u4ee5\u4e0b\u5176\u4e00\uff08iTerm2 \u7248\u672c\u4e0d\u540c\u53ef\u80fd\u6703\u4e0d\u4e00\u6a23\uff09\uff1a<\/p>\n\n<ul>\n  <li>Left option (\u2325) key acts as: +Esc<\/li>\n  <li>Left \u2325 key: +Esc<\/li>\n<\/ul>\n\n<h3 id=\"\u9084\u539f\u81f3\u9810\u8a2d\u503c\">\u9084\u539f\u81f3\u9810\u8a2d\u503c<\/h3>\n<p>\u6839\u64da iTerm2 \u5b98\u7db2\u7684 <a href=\"http:\/\/iterm2.com\/faq.html\">FAQ \u8aaa\u660e<\/a>\uff0c\u8981\u5c07\u8a2d\u5b9a\u9084\u539f\u6210\u9810\u8a2d\u503c\u53ef\u4ee5\u900f\u904e\u4ee5\u4e0b\u6307\u4ee4\u522a\u9664\u8a2d\u5b9a\u6a94\u4f86\u9054\u6210\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>defaults delete com.googlecode.iterm2\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"https:\/\/docs.brew.sh\/\">Homebrew - Documentation<\/a><\/li>\n  <li><a href=\"https:\/\/github.com\/caskroom\/homebrew-cask\/blob\/master\/USAGE.md\">Homebrew-Cask - How to Use Homebrew-Cask<\/a><\/li>\n  <li><a href=\"http:\/\/iterm2.com\/documentation.html\">iTerm2 - Documentation<\/a><\/li>\n<\/ul>\n","pubDate":"Wed, 25 Oct 2017 00:00:00 +0000"},{"title":"npm vs. Yarn\uff1a\u6307\u4ee4\u5c0d\u7167","link":"\/2017\/10\/14\/npm-vs-yarn-cli-commands-comparison.html","guid":"\/2017\/10\/14\/npm-vs-yarn-cli-commands-comparison.html","description":"<p><a href=\"https:\/\/yarnpkg.com\">Yarn<\/a> \u662f Facebook \u6240\u767c\u5e03\u7684 Node.js \u5957\u4ef6\u7ba1\u7406\u5de5\u5177\uff0c\u76f8\u8f03\u65bc <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a> \u6709\u591a\u9805\u6539\u9032\u3002\u6700\u91cd\u8981\u7684\u662f\uff0cYarn \u5b89\u88dd\u5957\u4ef6\u7684\u901f\u5ea6\u5feb\u4e0a\u4e0d\u5c11\uff0c\u4e5f\u53ef\u4ee5\u76f8\u5bb9\u65bc npm\u3002<\/p>\n\n<h2 id=\"\u5e38\u7528\u6307\u4ee4\u5c0d\u7167\">\u5e38\u7528\u6307\u4ee4\u5c0d\u7167<\/h2>\n\n<table>\n  <thead>\n    <tr>\n      <th>npm<\/th>\n      <th>Yarn<\/th>\n      <th>\u6307\u4ee4\u8aaa\u660e<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm init<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn init<\/code><\/td>\n      <td>\u5efa\u7acb package.json \u8a2d\u5b9a\u6a94<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm install<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn install<\/code><\/td>\n      <td>\u4f9d package.json \u5b89\u88dd\u76f8\u4f9d\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm install [package]<\/code><\/td>\n      <td>\uff08\u4e0d\u652f\u63f4\uff09<\/td>\n      <td>\u50c5\u5b89\u88dd\u4f46\u4e0d\u52a0\u5165\u70ba\u76f8\u4f9d\u5957\u4ef6\uff08npm\uff1av5 \u4e4b\u5f8c\u9810\u8a2d\u884c\u70ba\u7b49\u540c\u65bc\u52a0 <code class=\"highlighter-rouge\">--save<\/code> \u53c3\u6578\uff09<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm install --save [package]<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn add [package]<\/code><\/td>\n      <td>\u5b89\u88dd\u4e26\u52a0\u5165\u70ba\u6b63\u5f0f\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6 \uff08package.json \u4e2d\u7684 <code class=\"highlighter-rouge\">dependencies<\/code> \u5c6c\u6027\uff09<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm install --save-dev [package]<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn add [package] [--dev\/-D]<\/code><\/td>\n      <td>\u5b89\u88dd\u4e26\u52a0\u5165\u70ba\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff08package.json \u4e2d\u7684 <code class=\"highlighter-rouge\">devDependencies<\/code> \u5c6c\u6027\uff09<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm install --global [package]<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn global add [package]<\/code><\/td>\n      <td>\u5b89\u88dd\u5957\u4ef6\u81f3\u5168\u57df\u4e2d\uff08\u65b9\u4fbf\u4f7f\u7528\u5957\u4ef6\u63d0\u4f9b\u4e4b\u6307\u4ee4\uff09<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm uninstall [package]<\/code><\/td>\n      <td>\uff08\u4e0d\u652f\u63f4\uff09<\/td>\n      <td>\u50c5\u79fb\u9664\u4f46\u4e0d\u4e00\u4f75\u79fb\u9664\u8a72\u5957\u4ef6\u65bc package.json \u4e2d\u7684\u76f8\u4f9d\uff08npm\uff1av5 \u4e4b\u5f8c\u9810\u8a2d\u884c\u70ba\u7b49\u540c\u65bc\u52a0 <code class=\"highlighter-rouge\">--save<\/code> \u53c3\u6578\uff09<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm uninstall --save [package]<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn remove [package]<\/code><\/td>\n      <td>\u79fb\u9664\u4e14\u4e00\u4f75\u79fb\u9664\u8a72\u5957\u4ef6\u65bc package.json \u4e2d\u7684\u6b63\u5f0f\u74b0\u5883\u76f8\u4f9d\uff08<code class=\"highlighter-rouge\">dependencies<\/code> \u5c6c\u6027\uff09<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm uninstall --save-dev [package]<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn remove [package]<\/code><\/td>\n      <td>\u79fb\u9664\u4e14\u4e00\u4f75\u79fb\u9664\u8a72\u5957\u4ef6\u65bc package.json \u4e2d\u7684\u958b\u767c\u74b0\u5883\u76f8\u4f9d\uff08<code class=\"highlighter-rouge\">devDependencies<\/code> \u5c6c\u6027\uff09<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm outdated<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn outdated<\/code><\/td>\n      <td>\u6aa2\u67e5\u904e\u671f\uff08\u5df2\u6709\u65b0\u7248\uff09\u7684\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm update<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn upgrade<\/code><\/td>\n      <td>\u66f4\u65b0\u6240\u6709\u5c08\u6848\u76f8\u4f9d\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm update [package]<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn upgrade [package]<\/code><\/td>\n      <td>\u66f4\u65b0\u6307\u5b9a\u7684\u5c08\u6848\u76f8\u4f9d\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm update [package]@latest<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn upgrade [package] --latest<\/code><\/td>\n      <td>\u66f4\u65b0\u6307\u5b9a\u7684\u5c08\u6848\u76f8\u4f9d\u5957\u4ef6\u81f3\u6700\u65b0\u7684 major version<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm update --global<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn upgrade --global<\/code><\/td>\n      <td>\u66f4\u65b0\u6240\u6709\u5168\u57df\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm update --global [package]<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn upgrade --global [package]<\/code><\/td>\n      <td>\u66f4\u65b0\u6307\u5b9a\u7684\u5168\u57df\u5957\u4ef6<\/td>\n    <\/tr>\n    <tr>\n      <td><code class=\"highlighter-rouge\">npm run [script]<\/code><\/td>\n      <td><code class=\"highlighter-rouge\">yarn run [script]<\/code><\/td>\n      <td>\u57f7\u884c\u5c08\u6848\u81ea\u8a02\u6307\u4ee4\uff08package.json \u4e2d\u7684 <code class=\"highlighter-rouge\">scripts<\/code> \u5c6c\u6027\uff09<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"https:\/\/yarnpkg.com\/en\/docs\/migrating-from-npm\">Yarn - Migrating from npm<\/a><\/li>\n  <li><a href=\"https:\/\/yarnpkg.com\/en\/docs\">Yarn - Docs<\/a>\n    <ul>\n      <li><a href=\"https:\/\/yarnpkg.com\/en\/docs\/cli\/upgrade\">yarn upgrade<\/a><\/li>\n    <\/ul>\n  <\/li>\n  <li><a href=\"https:\/\/docs.npmjs.com\/\">npm - documentation<\/a>\n    <ul>\n      <li><a href=\"https:\/\/docs.npmjs.com\/cli\/install\">npm-install<\/a><\/li>\n    <\/ul>\n  <\/li>\n<\/ul>\n","pubDate":"Sat, 14 Oct 2017 00:00:00 +0000"},{"title":"\u7ba1\u7406 macOS \u4e2d\u7684 JDK \u7248\u672c","link":"\/2017\/10\/12\/manage-jdk-version-on-macos.html","guid":"\/2017\/10\/12\/manage-jdk-version-on-macos.html","description":"<p>\u5728 macOS \u4e2d\uff0c\u53ef\u4ee5\u5b89\u88dd\u4e26\u540c\u6642\u5b58\u5728\u591a\u500b\u7248\u672c\u7684 Java Development Kit\uff08JDK\uff09\u3002\u6211\u5011\u53ef\u4ee5\u4f7f\u7528 <a href=\"http:\/\/www.jenv.be\/\">jEnv<\/a> \u4f86\u7ba1\u7406\u4e0d\u540c\u7248\u672c\u7684 JDK \u958b\u767c\u74b0\u5883\u3002<\/p>\n\n<h2 id=\"\u5b89\u88dd-jenv\">\u5b89\u88dd jEnv<\/h2>\n\n<p>\u4f7f\u7528 <a href=\"http:\/\/brew.sh\/index_zh-tw.html\">Homebrew<\/a> \u5b89\u88dd\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install jenv\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u8a2d\u5b9a-jenv\">\u8a2d\u5b9a jEnv<\/h2>\n\n<p>\u9996\u5148\u57f7\u884c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>jenv init\n<\/code><\/pre><\/div><\/div>\n\n<p>\u6703\u6839\u64da\u57f7\u884c\u7684 shell \u74b0\u5883\u4f86\u986f\u793a\u8aaa\u660e\uff0c\u4f8b\u5982\u5728 zsh \u4e0b\u63d0\u793a\u8a0a\u606f\u70ba\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code># Load jenv automatically by adding\n# the following to ~\/.zshrc:\n\neval \"$(jenv init -)\"\n\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4f9d\u6b64\u8aaa\u660e\uff0c\u81f3 .zshrc \u8a2d\u5b9a\u6a94\u4e2d\u52a0\u5165\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>eval \"$(jenv init -)\"\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u91cd\u8f09\u5165 .zshrc \u8a2d\u5b9a\u6a94\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> ~\/.zshrc\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u7ba1\u7406-jdk-\u7248\u672c\">\u7ba1\u7406 JDK \u7248\u672c<\/h2>\n\n<p>\u67e5\u770b\u76ee\u524d\u7cfb\u7d71\u4e2d\u6240\u6709\u5df2\u5b89\u88dd\u7684\u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>jenv versions\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5f85\u624b\u52d5\u5b89\u88dd\u5b8c\u6307\u5b9a\u7248\u672c\u5f8c\uff0c\u518d\u8a2d\u5b9a\u8981\u4f7f\u7528\u7684 JDK \u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>jenv global 1.8\n<\/code><\/pre><\/div><\/div>\n\n<p><em>\uff08jEnv \u6c92\u6709\u5b89\u88dd\u3001\u79fb\u9664 JDK \u7684\u529f\u80fd\uff0c\u8981\u81ea\u884c\u5b89\u88dd\u6240\u9700\u7248\u672c\u7684 JDK\uff09<\/em><\/p>\n\n<p>\u67e5\u770b\u76ee\u524d\u6240\u4f7f\u7528\u7684\u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>jenv version\n<\/code><\/pre><\/div><\/div>\n","pubDate":"Thu, 12 Oct 2017 00:00:00 +0000"},{"title":"\u7ba1\u7406 macOS \u4e2d\u7684 Python \u7248\u672c","link":"\/2017\/07\/14\/manage-python-version-on-macos.html","guid":"\/2017\/07\/14\/manage-python-version-on-macos.html","description":"<p>\u76ee\u524d macOS \u7cfb\u7d71\u5167\u5efa\u7684 Python \u7248\u672c\u70ba 2.x\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528 <a href=\"https:\/\/github.com\/pyenv\/pyenv\">pyenv<\/a> \u4f86\u7ba1\u7406\u3001\u5b89\u88dd\u4e0d\u540c\u7248\u672c\u3002<\/p>\n\n<h2 id=\"\u5b89\u88dd-pyenv\">\u5b89\u88dd pyenv<\/h2>\n\n<p>\u4f7f\u7528 <a href=\"http:\/\/brew.sh\/index_zh-tw.html\">Homebrew<\/a> \u5b89\u88dd\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install pyenv\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u8a2d\u5b9a-pyenv\">\u8a2d\u5b9a pyenv<\/h2>\n\n<p>\u9996\u5148\u57f7\u884c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pyenv init\n<\/code><\/pre><\/div><\/div>\n\n<p>pyenv \u6703\u6839\u64da\u57f7\u884c\u7684 shell \u74b0\u5883\u4f86\u986f\u793a\u8aaa\u660e\uff0c\u4f8b\u5982\u5728 fish \u4e0b\u63d0\u793a\u8a0a\u606f\u70ba\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code># Load pyenv automatically by appending\n# the following to ~\/.config\/fish\/config.fish:\n\nstatus --is-interactive; and source (pyenv init -|psub)\n\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4f9d\u6b64\u8aaa\u660e\uff0c\u81f3 config.fish \u8a2d\u5b9a\u6a94\u4e2d\u52a0\u5165\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>status --is-interactive; and source (pyenv init -|psub)\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u91cd\u8f09\u5165 config.fish \u8a2d\u5b9a\u6a94\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> ~\/.config\/fish\/config.fish\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u5b89\u88dd\u6307\u5b9a\u7248\u672c-python\">\u5b89\u88dd\u6307\u5b9a\u7248\u672c Python<\/h2>\n\n<p>\u67e5\u770b\u76ee\u524d\u7cfb\u7d71\u4e2d\u6240\u6709\u5df2\u5b89\u88dd\u7684\u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pyenv versions\n<\/code><\/pre><\/div><\/div>\n\n<p>\u67e5\u770b\u76ee\u524d\u53ef\u5b89\u88dd\u7684\u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pyenv install <span class=\"nt\">--list<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4ee5\u5b89\u88dd Python 3.6.1 \u7248\u70ba\u4f8b\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pyenv install 3.6.1\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5f85\u7de8\u8b6f\u3001\u5b89\u88dd\u5b8c\u6307\u5b9a\u7248\u672c\u5f8c\uff0c\u518d\u8a2d\u5b9a\u8981\u4f7f\u7528\u7684 Python \u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pyenv global 3.6.1\n<\/code><\/pre><\/div><\/div>\n\n<p>\u67e5\u770b\u76ee\u524d\u6240\u4f7f\u7528\u7684\u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pyenv version\n<\/code><\/pre><\/div><\/div>\n","pubDate":"Fri, 14 Jul 2017 00:00:00 +0000"},{"title":"\u66f4\u65b0 macOS \u4e2d\u7684 Ruby","link":"\/2017\/07\/01\/upgrade-ruby-on-macos.html","guid":"\/2017\/07\/01\/upgrade-ruby-on-macos.html","description":"<p>macOS \u7cfb\u7d71\u5167\u5efa\u7684 Ruby \u7248\u672c\u8f03\u70ba\u8001\u820a\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528 <a href=\"https:\/\/github.com\/rbenv\/rbenv\">rbenv<\/a> + <a href=\"https:\/\/github.com\/rbenv\/ruby-build\">ruby-build<\/a> \u4f86\u7ba1\u7406\u3001\u5b89\u88dd\u4e0d\u540c\u7248\u672c\u3002<\/p>\n\n<h2 id=\"\u5b89\u88dd-rbenv--ruby-build\">\u5b89\u88dd rbenv + ruby-build<\/h2>\n\n<p>\u4f7f\u7528 <a href=\"http:\/\/brew.sh\/index_zh-tw.html\">Homebrew<\/a> \u5b89\u88dd\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install rbenv\n<span class=\"nv\">$ <\/span>brew install ruby-build\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u8a2d\u5b9a-rbenv\">\u8a2d\u5b9a rbenv<\/h2>\n\n<p>\u9996\u5148\u57f7\u884c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>rbenv init\n<\/code><\/pre><\/div><\/div>\n\n<p>rbenv \u6703\u6839\u64da\u57f7\u884c\u7684 shell \u74b0\u5883\u4f86\u986f\u793a\u8aaa\u660e\uff0c\u4f8b\u5982\u5728 bash \u4e0b\u63d0\u793a\u8a0a\u606f\u70ba\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code># Load rbenv automatically by appending\n# the following to ~\/.bash_profile:\n\neval \"$(rbenv init -)\"\n\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4f9d\u6b64\u8aaa\u660e\uff0c\u81f3 .bash_profile \u8a2d\u5b9a\u6a94\u4e2d\u52a0\u5165\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>eval \"$(rbenv init -)\"\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u91cd\u8f09\u5165 .bash_profile \u8a2d\u5b9a\u6a94\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> ~\/.bash_profile\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u5b89\u88dd\u6307\u5b9a\u7248\u672c-ruby\">\u5b89\u88dd\u6307\u5b9a\u7248\u672c Ruby<\/h2>\n\n<p>\u67e5\u770b\u76ee\u524d\u7cfb\u7d71\u4e2d\u6240\u6709\u5df2\u5b89\u88dd\u7684\u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>rbenv versions\n<\/code><\/pre><\/div><\/div>\n\n<p>\u67e5\u770b\u76ee\u524d\u53ef\u5b89\u88dd\u7684\u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>rbenv install <span class=\"nt\">--list<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4ee5\u5b89\u88dd Ruby 2.4.1 \u7248\u70ba\u4f8b\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>rbenv install 2.4.1\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5f85\u7531 ruby-build \u7de8\u8b6f\u3001\u5b89\u88dd\u5b8c\u6307\u5b9a\u7248\u672c\u5f8c\uff0c\u518d\u8a2d\u5b9a\u8981\u4f7f\u7528\u7684 Ruby \u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>rbenv global 2.4.1\n<\/code><\/pre><\/div><\/div>\n\n<p>\u67e5\u770b\u76ee\u524d\u6240\u4f7f\u7528\u7684\u7248\u672c\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>rbenv version\n<\/code><\/pre><\/div><\/div>\n","pubDate":"Sat, 01 Jul 2017 00:00:00 +0000"},{"title":"Flow-Typed","link":"\/2017\/04\/13\/flow-typed.html","guid":"\/2017\/04\/13\/flow-typed.html","description":"<p>\u6253\u958b Flow \u7684\u578b\u5225\u6aa2\u67e5\u529f\u80fd\u5f8c\uff0c\u99ac\u4e0a\u53ef\u4ee5\u767c\u73fe\u4e00\u4e9b\u7b2c\u4e09\u65b9\u5957\u4ef6\u56e0\u70ba\u6c92\u6709\u64b0\u5beb Flow \u7684\u578b\u5225\u8a3b\u89e3\uff08Type Annotation\uff09\u4f7f\u5f97 Flow \u8df3\u51fa\u4e86\u6aa2\u67e5\u932f\u8aa4\u3002\u6211\u5011\u53ef\u4ee5\u5229\u7528 <a href=\"https:\/\/github.com\/flowtype\/flow-typed\">Flow-Typed<\/a> \u4e0b\u8f09\u5c0d\u7b2c\u4e09\u65b9\u5957\u4ef6\u7684\u578b\u5225\u5b9a\u7fa9\u6a94\u6848\u3002<\/p>\n\n<h2 id=\"\u5b89\u88dd-flow-typed\">\u5b89\u88dd Flow-Typed<\/h2>\n<p>\u7531\u65bc\u6211\u5011\u50c5\u4f7f\u7528 Flow-Typed \u4e0b\u8f09\u5c08\u6848\u76f8\u4f9d\u7684\u7b2c\u4e09\u65b9\u5957\u4ef6\u578b\u5225\u5b9a\u7fa9\u6a94\uff0c\u6240\u4ee5\u53ea\u9808\u5b89\u88dd\u81f3\u5168\u57df\u4f86\u4f7f\u7528 <code class=\"highlighter-rouge\">flow-typed<\/code> \u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install flow-typed <span class=\"nt\">--global<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u4f7f\u7528-flow-typed-\u4e0b\u8f09\u7b2c\u4e09\u65b9\u5957\u4ef6\u578b\u5225\u5b9a\u7fa9\u6a94\">\u4f7f\u7528 Flow-Typed \u4e0b\u8f09\u7b2c\u4e09\u65b9\u5957\u4ef6\u578b\u5225\u5b9a\u7fa9\u6a94<\/h2>\n<p>\u65bc\u5c08\u6848\u6839\u76ee\u9304\u4e2d\u8f38\u5165\u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>flow-typed install\n<\/code><\/pre><\/div><\/div>\n\n<p>Flow-Typed \u4fbf\u6703\u958b\u59cb\u641c\u5c0b\u5c08\u6848\u6240\u4f9d\u8cf4\u7684\u5957\u4ef6\uff0c\u4e26\u4e0b\u8f09\u578b\u5225\u5b9a\u7fa9\u6a94\u6848\u81f3\u65b0\u5efa\u7acb\u7684 flow-typed \u76ee\u9304\u4e2d\u3002<\/p>\n\n<h2 id=\"\u8a2d\u5b9a-gitignore\">\u8a2d\u5b9a .gitignore<\/h2>\n<p>Flow-Typed \u6703\u65bc\u5c08\u6848\u4e2d\u5efa\u7acb flow-typed \u76ee\u9304\u653e\u7f6e\u7b2c\u4e09\u65b9\u5957\u4ef6\u578b\u5225\u5b9a\u7fa9\u6a94\uff0c\u6211\u5011\u53ef\u4ee5\u8a2d\u5b9a Git \u6392\u9664\u6b64\u76ee\u9304\u3002<\/p>\n\n<p>\u5c07\u76ee\u9304\u540d\u7a31\u52a0\u5165 .gitignore \u8a2d\u5b9a\u6a94\u4e2d\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>flow-typed\/\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"https:\/\/flow.org\/blog\/2016\/10\/13\/Flow-Typed\/\">Flow - Introducing Flow-Typed<\/a><\/li>\n  <li><a href=\"https:\/\/flow.org\/en\/docs\/libdefs\/\">Flow - Library Definitions<\/a><\/li>\n  <li><a href=\"https:\/\/flow.org\/en\/docs\/config\/libs\/\">Flow - .flowconfig [libs]<\/a><\/li>\n  <li><a href=\"https:\/\/jackblackevo.github.io\/flow\/\">Flow<\/a><\/li>\n  <li><a href=\"https:\/\/jackblackevo.github.io\/simple-es6-project\/\">\u5efa\u7acb\u57fa\u672c\u7684 ES6 \u5c08\u6848<\/a><\/li>\n<\/ul>\n","pubDate":"Thu, 13 Apr 2017 00:00:00 +0000"},{"title":"Flow","link":"\/2017\/04\/12\/flow.html","guid":"\/2017\/04\/12\/flow.html","description":"<p>\u7531\u65bc JavaScript \u662f\u504f\u5411\u5f31\u578b\u5225\uff08weak type\uff09\u7684\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u56e0\u6b64\u5929\u751f\u7f3a\u5c11\u5982 Java \u4e00\u822c\u7684\u578b\u5225\u6aa2\u67e5\u529f\u80fd\u3002\u4e0d\u904e\u6211\u5011\u53ef\u4ee5\u85c9\u52a9 <a href=\"https:\/\/flow.org\/\">Flow<\/a> \u5de5\u5177\uff0c\u70ba JS \u52a0\u4e0a\u975c\u614b\u8cc7\u6599\u985e\u578b\u6aa2\u67e5\u7684\u529f\u80fd\u3002<\/p>\n\n<h2 id=\"\u5b89\u88dd-flow\">\u5b89\u88dd Flow<\/h2>\n<p>\u5148\u5c07 Flow \u5b89\u88dd\u81f3\u5168\u57df\u4e2d\uff0c\u4ee5\u4fbf\u6211\u5011\u4f7f\u7528 <code class=\"highlighter-rouge\">flow<\/code> \u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install flow-bin <span class=\"nt\">--global<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5b89\u88dd\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install flow-bin <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u8a2d\u5b9a-flow\">\u8a2d\u5b9a Flow<\/h2>\n<p>\u65bc\u5c08\u6848\u6839\u76ee\u9304\u4e2d\u8f38\u5165\u6307\u4ee4\u4f86\u5efa\u7acb .flowconfig \u8a2d\u5b9a\u6a94\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>flow init\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"visual-studio-code-extension\">Visual Studio Code extension<\/h2>\n<p><a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a>\uff08VSCode\uff09\u53ef\u4ee5\u518d\u52a0\u88dd <a href=\"https:\/\/marketplace.visualstudio.com\/items\/gcazaciuc.vscode-flow-ide\">vscode-flow-ide<\/a> \u63d2\u4ef6\uff0c\u8b93\u6211\u5011\u53ef\u4ee5\u5728\u64b0\u5beb\u7a0b\u5f0f\u78bc\u6642\u5c31\u5373\u6642\u770b\u5230\u6aa2\u67e5\u63d0\u793a\u3002<\/p>\n\n<p>vscode-flow-ide \u5fc5\u9808\u5148\u65bc\u5168\u57df\u6216\u5c08\u6848\u958b\u767c\u74b0\u5883\u4e2d\u5b89\u88dd\u597d Flow\uff0c\u5426\u5247\u4e0d\u6703\u555f\u7528\u3002\u4e26\u4e14\u5c08\u6848\u4e2d\u5fc5\u9808\u6709 Flow \u7684 .flowconfig \u8a2d\u5b9a\u6a94\u3002<\/p>\n\n<p>\u53e6\u5916\u9084\u9808\u5230 VSCode \u7684\u300c\u559c\u597d\u8a2d\u5b9a -&gt; \u8a2d\u5b9a\u300d\uff08settings.json\uff09\u5c07 VSCode \u5167\u5efa\u7684 JavaScript \u9a57\u8b49\u95dc\u9589\uff1a<\/p>\n\n<div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"javascript.validate.enable\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">false<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u8b93-eslint-\u652f\u63f4-flow-\u8a9e\u6cd5\">\u8b93 ESLint \u652f\u63f4 Flow \u8a9e\u6cd5<\/h2>\n<p>\u7531\u65bc Flow \u7684\u578b\u5225\u6a19\u793a\u8a9e\u6cd5\u4e26\u4e0d\u662f ECMAScript \u6a19\u6e96\uff0c\u6240\u4ee5 ESLint \u6703\u5728\u6aa2\u67e5\u6642\u5c07\u6240\u6709 Flow \u8a9e\u6cd5\u8996\u70ba\u932f\u8aa4\u7684 JS \u8a9e\u6cd5\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e <a href=\"https:\/\/www.npmjs.com\/package\/eslint-plugin-flowtype\">eslint-plugin-flowtype<\/a> \u8b93 ESLint \u652f\u63f4\u6aa2\u67e5 Flow \u8a9e\u6cd5\u3002<\/p>\n\n<p>\u5c07 eslint-plugin-flowtype \u5b89\u88dd\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install eslint-plugin-flowtype <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u5b89\u88dd <a href=\"https:\/\/www.npmjs.com\/package\/babel-eslint\">babel-eslint<\/a> \u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install babel-eslint <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5c07\u4ee5\u4e0b <code class=\"highlighter-rouge\">extends<\/code> \u53ca <code class=\"highlighter-rouge\">plugins<\/code> \u5c6c\u6027\u52a0\u5165 .eslintrc.json \u8a2d\u5b9a\u6a94\u4e2d\uff1a<\/p>\n\n<div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"extends\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"plugin:flowtype\/recommended\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"plugins\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"flowtype\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">]<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u642d\u914d-webpack-2\">\u642d\u914d webpack 2<\/h2>\n<p>\u5148\u5c07 Flow \u5b89\u88dd\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install flow-bin <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u8b93-babel-\u652f\u63f4-flow-\u8a9e\u6cd5\">\u8b93 Babel \u652f\u63f4 Flow \u8a9e\u6cd5<\/h3>\n<p>\u8207 ESLint \u7684\u539f\u56e0\u76f8\u540c\uff0cBabel \u4e5f\u4e0d\u652f\u63f4 Flow \u8a9e\u6cd5\u3002\u9808\u5b89\u88dd babel-preset-flow\uff0c\u8b93 Babel \u5728\u8f49\u8b6f\u7a0b\u5f0f\u78bc\u524d\u5148\u5c07 Flow \u8a9e\u6cd5\u79fb\u9664\u3002<\/p>\n\n<p>\u5b89\u88dd <a href=\"https:\/\/www.npmjs.com\/package\/babel-preset-flow\">babel-preset-flow<\/a> \u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install babel-preset-flow <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u65bc .babelrc \u8a2d\u5b9a\u6a94\u4e2d\u52a0\u5165\u4ee5\u4e0b <code class=\"highlighter-rouge\">presets<\/code> \u5c6c\u6027\uff1a<\/p>\n\n<div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"presets\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"flow\"<\/span><span class=\"p\">]<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u65bc-webpack-\u81ea\u52d5\u6aa2\u67e5\u578b\u5225\">\u65bc webpack \u81ea\u52d5\u6aa2\u67e5\u578b\u5225<\/h3>\n<p>\u900f\u904e <a href=\"https:\/\/www.npmjs.com\/package\/flow-webpack-plugin\">flow-webpack-plugin<\/a> \u53ef\u4ee5\u8b93 webpack \u5728\u7de8\u8b6f\u6253\u5305\u524d\u5148\u4f7f\u7528 Flow \u9032\u884c\u578b\u5225\u6aa2\u67e5\u3002<\/p>\n\n<p>\u5b89\u88dd flow-webpack-plugin \u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install flow-webpack-plugin <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u65bc webpack 2 \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">plugins<\/code> \u52a0\u5165\u63d2\u4ef6\uff1a<\/p>\n\n<div class=\"language-javascript highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">FlowwebpackPlugin<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"s1\">'flow-webpack-plugin'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">webpackConfig<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">plugins<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nx\">FlowwebpackPlugin<\/span><span class=\"p\">()<\/span>\n  <span class=\"p\">]<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"https:\/\/jackblackevo.github.io\/eslint\/\">ESLint<\/a><\/li>\n  <li><a href=\"https:\/\/jackblackevo.github.io\/simple-es6-project\/\">\u5efa\u7acb\u57fa\u672c\u7684 ES6 \u5c08\u6848<\/a><\/li>\n<\/ul>\n","pubDate":"Wed, 12 Apr 2017 00:00:00 +0000"},{"title":"ESLint","link":"\/2017\/04\/12\/eslint.html","guid":"\/2017\/04\/12\/eslint.html","description":"<p><a href=\"https:\/\/jackblackevo.github.io\/javascript-standard-style\/\">\u524d\u4e00\u7bc7<\/a>\u6211\u5011\u4f7f\u7528\u4e86 JavaScript Standard Style\uff08StandardJS\uff09\u9032\u884c\u7a0b\u5f0f\u78bc\u6aa2\u67e5\u3002\u4e0d\u904e\u70ba\u4e86\u65b9\u4fbf\u4e4b\u5f8c\u7d50\u5408 <a href=\"https:\/\/flow.org\/\">Flow<\/a> \u5de5\u5177\uff0c\u6211\u5011\u9019\u6b21\u6539\u4ee5 <a href=\"http:\/\/eslint.org\/\">ESLint<\/a> \u642d\u914d StandardJS \u98a8\u683c\u6307\u5f15\u7684\u65b9\u5f0f\uff0c\u9054\u5230\u4e00\u6a21\u4e00\u6a23\u7684\u6548\u679c\uff0c\u4e26\u70ba\u652f\u63f4 Flow \u505a\u597d\u6e96\u5099\u3002<\/p>\n\n<h2 id=\"\u5b89\u88dd-eslint\">\u5b89\u88dd ESLint<\/h2>\n<p>\u5148\u5c07 ESLint \u5b89\u88dd\u81f3\u5168\u57df\u4e2d\uff0c\u4ee5\u4fbf\u6211\u5011\u4f7f\u7528 <code class=\"highlighter-rouge\">eslint<\/code> \u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install eslint <span class=\"nt\">--global<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5b89\u88dd\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install eslint <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u8a2d\u5b9a-eslint\">\u8a2d\u5b9a ESLint<\/h2>\n<p>\u65bc\u5c08\u6848\u6839\u76ee\u9304\u4e2d\u8f38\u5165\u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>eslint <span class=\"nt\">--init<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u4f9d\u63d0\u793a\u6b65\u9a5f\u8a2d\u5b9a\uff1a<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>? How would you like to configure ESLint? (Use arrow keys)\n&gt; Use a popular style guide\n\n? Which style guide do you want to follow? (Use arrow keys)\n&gt; Standard\n\n? What format do you want your config file to be in? (Use arrow keys)\n&gt; JSON\n<\/code><\/pre><\/div><\/div>\n\n<p>\u63a5\u8457\u6703\u81ea\u52d5\u5b89\u88dd\u8a2d\u5b9a\u6a94\u4e2d\u6240\u4f9d\u8cf4\u7684\u4ee5\u4e0b\u5957\u4ef6\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n<ul>\n  <li>eslint-plugin-standard<\/li>\n  <li>eslint-plugin-promise<\/li>\n  <li>eslint-config-standard<\/li>\n<\/ul>\n\n<p>\u5b8c\u6210\u5f8c\u4fbf\u6703\u7522\u751f .eslintrc.json \u8a2d\u5b9a\u6a94\u3002<\/p>\n\n<p>\u540c\u6642\u6211\u5011\u4e5f\u770b\u5230\u8a0a\u606f\u4e2d\u986f\u793a\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>npm WARN eslint-config-standard@10.2.0 requires a peer of eslint-plugin-import@&gt;<span class=\"o\">=<\/span>2.2.0 but none was installed.\nnpm WARN eslint-config-standard@10.2.0 requires a peer of eslint-plugin-node@&gt;<span class=\"o\">=<\/span>4.2.2 but none was installed.\n<\/code><\/pre><\/div><\/div>\n\n<p>\u56e0\u70ba\u7f3a\u4e86\u9019\u5169\u500b\u76f8\u4f9d\u5957\u4ef6\uff0c\u6240\u4ee5\u6700\u5f8c\u624b\u52d5\u88dc\u88dd\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install eslint-plugin-import <span class=\"nt\">--save-dev<\/span>\n<span class=\"nv\">$ <\/span>npm install eslint-plugin-node <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"visual-studio-code-extension\">Visual Studio Code extension<\/h2>\n<p><a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a>\uff08VSCode\uff09\u53ef\u4ee5\u518d\u52a0\u88dd <a href=\"https:\/\/marketplace.visualstudio.com\/items\/dbaeumer.vscode-eslint\">VS Code ESLint extension<\/a> \u63d2\u4ef6\uff0c\u8b93\u6211\u5011\u53ef\u4ee5\u5728\u64b0\u5beb\u7a0b\u5f0f\u78bc\u6642\u5c31\u5373\u6642\u770b\u5230\u6aa2\u67e5\u63d0\u793a\u53ca\u53ef\u81ea\u52d5\u4fee\u6b63\u7684\u9078\u9805\u3002<\/p>\n\n<p>VS Code ESLint extension \u5fc5\u9808\u5148\u65bc\u5168\u57df\u6216\u5c08\u6848\u958b\u767c\u74b0\u5883\u4e2d\u5b89\u88dd\u597d ESLint\uff0c\u5426\u5247\u4e0d\u6703\u555f\u7528\u3002\u4e26\u4e14\u5c08\u6848\u4e2d\u5fc5\u9808\u6709 ESLint \u7684 .eslintrc.json \u8a2d\u5b9a\u6a94\u3002<\/p>\n\n<h2 id=\"\u642d\u914d-webpack-2\">\u642d\u914d webpack 2<\/h2>\n<p>\u9808\u5148\u5b89\u88dd ESLint \u53ca\u5b8c\u6210\u8a2d\u5b9a\u3002<\/p>\n\n<p>\u518d\u5b89\u88dd <a href=\"https:\/\/www.npmjs.com\/package\/eslint-loader\">eslint-loader<\/a> \u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install eslint-loader <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u65bc webpack 2 \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">module.rules<\/code> \u52a0\u5165\u6a21\u7d44\u8655\u7406\u898f\u5247\uff1a<\/p>\n\n<div class=\"language-javascript highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ \u8a2d\u5b9a\u70ba\u9810\u5148\u61c9\u7528\u7684\u898f\u5247\uff08\u5728\u5176\u5b83\u898f\u5247\u524d\u5148\u4f5c\u7528\uff09<\/span>\n  <span class=\"nl\">enforce<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'pre'<\/span><span class=\"p\">,<\/span>\n  <span class=\"c1\">\/\/ \u8cc7\u6e90\u6a94\u6848\u7be9\u9078\u689d\u4ef6<\/span>\n  <span class=\"nx\">resource<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ \u9808\u7b26\u5408\u6b63\u5247\u8868\u793a\u6cd5\u689d\u4ef6<\/span>\n    <span class=\"nl\">test<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n      <span class=\"c1\">\/\/ \u8868\u793a\u4f5c\u7528\u5728\u6240\u6709 *.js \u6a94\u6848<\/span>\n      <span class=\"sr\">\/<\/span><span class=\"se\">\\.<\/span><span class=\"sr\">js$\/<\/span>\n    <span class=\"p\">],<\/span>\n    <span class=\"c1\">\/\/ \u9808\u6392\u9664\u8def\u5f91\u689d\u4ef6\uff08\u672c\u6a5f\u8def\u5f91\uff0c\u9808\u70ba\u7d55\u5c0d\u8def\u5f91\uff09<\/span>\n    <span class=\"nx\">exclude<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n      <span class=\"c1\">\/\/ \u8868\u793a\u6392\u9664\u5c08\u6848\u4e2d\u7684 node_modules \u76ee\u9304<\/span>\n      <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'node_modules'<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">]<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"c1\">\/\/ \u61c9\u7528\u65bc\u6b64\u8655\u7406\u898f\u5247\u7684 Loaders\uff08\u8f49\u63db\u5668\uff09<\/span>\n  <span class=\"nx\">use<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">loader<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'eslint-loader'<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">]<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"http:\/\/eddychang.me\/blog\/javascript\/97-js-semicolon.html\">eddychang.me - JavaScript\u88e1\u7684\u8a9e\u53e5\u7528\u5206\u865f\u7d50\u5c3e\u662f\u500b\u9078\u9805\u55ce<\/a><\/li>\n  <li><a href=\"https:\/\/jackblackevo.github.io\/simple-es6-project\/\">\u5efa\u7acb\u57fa\u672c\u7684 ES6 \u5c08\u6848<\/a><\/li>\n<\/ul>\n","pubDate":"Wed, 12 Apr 2017 00:00:00 +0000"},{"title":"JavaScript Standard Style","link":"\/2017\/04\/11\/javascript-standard-style.html","guid":"\/2017\/04\/11\/javascript-standard-style.html","description":"<p>JavaScript \u672c\u8eab\u5c0d\u7a0b\u5f0f\u78bc\u7684\u64b0\u5beb\u98a8\u683c\uff08coding style\uff09\u4e26\u6c92\u6709\u592a\u591a\u7684\u898f\u7bc4\uff0c\u4e5f\u56e0\u6b64\u5bb9\u6613\u5beb\u51fa\u96dc\u4e82\u800c\u96e3\u4ee5\u7dad\u8b77\u7684\u7a0b\u5f0f\u3002<\/p>\n\n<p>Lint \u5de5\u5177\u53ef\u4ee5\u5e6b\u52a9\u6211\u5011\u4ee5\u8a02\u5b9a\u597d\u7684\u898f\u5247\u4f86\u5c0d\u7a0b\u5f0f\u78bc\u9032\u884c\u6aa2\u67e5\uff0c\u9664\u4e86\u80fd\u5920\u7d71\u4e00\u64b0\u5beb\u98a8\u683c\uff0c\u4e5f\u53ef\u4ee5\u6a19\u793a\u51fa\u8a9e\u6cd5\u7d50\u69cb\u4e0a\u6f5b\u5728\u7684\u554f\u984c\uff0c\u5354\u52a9\u63d0\u5347\u7a0b\u5f0f\u78bc\u54c1\u8cea\uff08code quality\uff09\u3002<\/p>\n\n<p>JavaScript \u7684\u8a9e\u6cd5\u6aa2\u67e5\u5de5\u5177\u6709\u8a31\u591a\u7a2e\uff0c\u5176\u4e2d\u5927\u90e8\u5206\u90fd\u8981\u4e8b\u5148\u9032\u884c\u76f8\u7576\u591a\u7684\u898f\u5247\u8a2d\u5b9a\u3002\u800c <a href=\"https:\/\/standardjs.com\/\">JavaScript Standard Style<\/a>\uff08StandardJS\uff09\u662f\u4e00\u500b\u6574\u7406\u51fa\u76ee\u524d JS \u793e\u7fa4\u4e2d\u6240\u6d41\u884c coding style \u7684 Lint \u5de5\u5177\uff0c\u63a1\u76f4\u63a5\u56fa\u5b9a\u898f\u5247\uff08\u4e0d\u9808\u3001\u4e5f\u4e0d\u53ef\u81ea\u884c\u8a2d\u5b9a\uff09\uff0c\u4e26\u4e14\u80fd\u5920\u81ea\u52d5\u4fee\u6b63\u4e0d\u5408\u898f\u7bc4\u7684\u7a0b\u5f0f\u78bc\u3002<\/p>\n\n<h2 id=\"flow-\u652f\u63f4\u5ea6\">Flow \u652f\u63f4\u5ea6<\/h2>\n<p>\u7531\u65bc StandardJS \u76ee\u524d\u4f9b webpack \u4f7f\u7528\u7684 standard-loader \u5c0d <a href=\"https:\/\/flow.org\/\">Flow<\/a> \u7684\u652f\u63f4\u5ea6\u4e0d\u4f73\u3002\u6211\u5011\u53ef\u4ee5\u6539\u7528 <a href=\"http:\/\/eslint.org\/\">ESLint<\/a> \u642d\u914d StandardJS \u98a8\u683c\u6307\u5f15\u7684\u65b9\u5f0f\uff0c\u9054\u5230\u4e00\u6a21\u4e00\u6a23\u7684\u6548\u679c\uff0c\u4e26\u65b9\u4fbf\u4e4b\u5f8c\u7d50\u5408 Flow \u5de5\u5177\u3002<\/p>\n\n<p>\u8acb\u53c3\u8003\uff1a<a href=\"https:\/\/jackblackevo.github.io\/eslint\/\">ESLint<\/a><\/p>\n\n<h2 id=\"\u5b89\u88dd-standardjs\">\u5b89\u88dd StandardJS<\/h2>\n<p>\u5148\u5c07 StandardJS \u5b89\u88dd\u81f3\u5168\u57df\u4e2d\uff0c\u4ee5\u4fbf\u6211\u5011\u4f7f\u7528 <code class=\"highlighter-rouge\">standard<\/code> \u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install standard <span class=\"nt\">--global<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5b89\u88dd\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install standard <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"visual-studio-code-extension\">Visual Studio Code extension<\/h2>\n<p><a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a>\uff08VSCode\uff09\u53ef\u4ee5\u518d\u52a0\u88dd <a href=\"https:\/\/marketplace.visualstudio.com\/items\/chenxsan.vscode-standardjs\">vscode-standardjs<\/a> \u63d2\u4ef6\uff0c\u8b93\u6211\u5011\u53ef\u4ee5\u5728\u64b0\u5beb\u7a0b\u5f0f\u78bc\u6642\u5c31\u5373\u6642\u770b\u5230\u6aa2\u67e5\u63d0\u793a\u53ca\u53ef\u81ea\u52d5\u4fee\u6b63\u7684\u9078\u9805\u3002<\/p>\n\n<p>vscode-standardjs \u5fc5\u9808\u5148\u65bc\u5168\u57df\u6216\u5c08\u6848\u958b\u767c\u74b0\u5883\u4e2d\u5b89\u88dd\u597d StandardJS\uff0c\u5426\u5247\u4e0d\u6703\u555f\u7528\u3002<\/p>\n\n<p>\u4e26\u4e14\u9808\u5230 VSCode \u7684\u300c\u559c\u597d\u8a2d\u5b9a -&gt; \u8a2d\u5b9a\u300d\uff08settings.json\uff09\u5c07 VSCode \u5167\u5efa\u7684 JavaScript \u9a57\u8b49\u95dc\u9589\uff1a<\/p>\n\n<div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"javascript.validate.enable\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">false<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u642d\u914d-webpack-2\">\u642d\u914d webpack 2<\/h2>\n<p>\u5148\u5c07 StandardJS \u5b89\u88dd\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install standard <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u518d\u5b89\u88dd <a href=\"https:\/\/www.npmjs.com\/package\/standard-loader\">standard-loader<\/a> \u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install standard-loader <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u65bc webpack 2 \u8a2d\u5b9a\u6a94\u4e2d\u7684 <code class=\"highlighter-rouge\">module.rules<\/code> \u52a0\u5165\u6a21\u7d44\u8655\u7406\u898f\u5247\uff1a<\/p>\n\n<div class=\"language-javascript highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ \u8a2d\u5b9a\u70ba\u9810\u5148\u61c9\u7528\u7684\u898f\u5247\uff08\u5728\u5176\u5b83\u898f\u5247\u524d\u5148\u4f5c\u7528\uff09<\/span>\n  <span class=\"nl\">enforce<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'pre'<\/span><span class=\"p\">,<\/span>\n  <span class=\"c1\">\/\/ \u8cc7\u6e90\u6a94\u6848\u7be9\u9078\u689d\u4ef6<\/span>\n  <span class=\"nx\">resource<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ \u9808\u7b26\u5408\u6b63\u5247\u8868\u793a\u6cd5\u689d\u4ef6<\/span>\n    <span class=\"nl\">test<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n      <span class=\"c1\">\/\/ \u8868\u793a\u4f5c\u7528\u5728\u6240\u6709 *.js \u6a94\u6848<\/span>\n      <span class=\"sr\">\/<\/span><span class=\"se\">\\.<\/span><span class=\"sr\">js$\/<\/span>\n    <span class=\"p\">],<\/span>\n    <span class=\"c1\">\/\/ \u9808\u6392\u9664\u8def\u5f91\u689d\u4ef6\uff08\u672c\u6a5f\u8def\u5f91\uff0c\u9808\u70ba\u7d55\u5c0d\u8def\u5f91\uff09<\/span>\n    <span class=\"nx\">exclude<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n      <span class=\"c1\">\/\/ \u8868\u793a\u6392\u9664\u5c08\u6848\u4e2d\u7684 node_modules \u76ee\u9304<\/span>\n      <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'node_modules'<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">]<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"c1\">\/\/ \u61c9\u7528\u65bc\u6b64\u8655\u7406\u898f\u5247\u7684 Loaders\uff08\u8f49\u63db\u5668\uff09<\/span>\n  <span class=\"nx\">use<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">loader<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'standard-loader'<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">]<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"http:\/\/eddychang.me\/blog\/javascript\/97-js-semicolon.html\">eddychang.me - JavaScript\u88e1\u7684\u8a9e\u53e5\u7528\u5206\u865f\u7d50\u5c3e\u662f\u500b\u9078\u9805\u55ce<\/a><\/li>\n  <li><a href=\"https:\/\/jackblackevo.github.io\/simple-es6-project\/\">\u5efa\u7acb\u57fa\u672c\u7684 ES6 \u5c08\u6848<\/a><\/li>\n<\/ul>\n","pubDate":"Tue, 11 Apr 2017 00:00:00 +0000"},{"title":"\u95dc\u9375\u8f49\u8b6f\u8def\u5f91","link":"\/2017\/03\/31\/critical-rendering-path.html","guid":"\/2017\/03\/31\/critical-rendering-path.html","description":"<p>\u95dc\u9375\u8f49\u8b6f\u8def\u5f91\uff08Critical Rendering Path\uff09\u4e5f\u88ab\u8b6f\u4f5c\u300c\u95dc\u9375\u6e32\u67d3\u8def\u5f91\u300d\uff0c\u8868\u793a\u700f\u89bd\u5668\u5728\u6e32\u67d3\u7db2\u9801\u6642\u7684\u95dc\u9375\u6b65\u9a5f\u3002<\/p>\n\n<p>\u6240\u8b02\u300c\u95dc\u9375\u300d\u6307\u7684\u662f\u5728\u6240\u6709\u6703\u5f71\u97ff\u9801\u9762\u6e32\u67d3\u901f\u5ea6\u7684\u56e0\u7d20\u4e2d\uff0c\u5f71\u97ff\u6bd4\u91cd\u8f03\u9ad8\u7684\u95dc\u9375\u8cc7\u6e90\uff08critical resource\uff09\u3002\u6211\u5011\u53ef\u4ee5\u5f9e\u4e0b\u9762\u7684\u7bc4\u4f8b\u4e2d\uff0c\u89c0\u5bdf\u5230\u700f\u89bd\u5668\u5f9e\u958b\u59cb\u8f09\u5165\u7db2\u9801\u5230\u6e32\u67d3\u5b8c\u6210\u5f8c\u986f\u793a\u65bc\u756b\u9762\u7684\u6574\u500b\u904e\u7a0b\u3002<\/p>\n\n<h2 id=\"\u700f\u89bd\u5668\u6e32\u67d3\u6d41\u7a0b\">\u700f\u89bd\u5668\u6e32\u67d3\u6d41\u7a0b<\/h2>\n<ol>\n  <li>\u700f\u89bd\u5668\u767c\u9001\u8acb\u6c42\uff08request\uff09\u81f3\u4f3a\u670d\u5668\u8981\u6c42\u53d6\u5f97\u7db2\u9801 HTML \u6a94\u6848<\/li>\n  <li>\u53d6\u5f97 HTML \u6a94\u6848\u5167\u5bb9\u4e4b\u5f8c\uff0c\u700f\u89bd\u5668\u4fbf\u958b\u59cb\u89e3\u6790\uff08parse\uff09\u4e26\u5efa\u69cb\uff08build\uff09\u9801\u9762\u7684\u6587\u4ef6\u7269\u4ef6\u6a21\u578b\uff08DOM\uff0cDocument Object Model\uff09\n    <ul>\n      <li>Bytes -&gt; Characters -&gt; Tokens -&gt; Nodes -&gt; DOM<\/li>\n    <\/ul>\n  <\/li>\n  <li>\u5728\u89e3\u6790 HTML \u7684\u904e\u7a0b\u4e2d\uff0c\u767c\u73fe\u5f15\u7528\u7684\u5916\u90e8\u8cc7\u6e90\u6642\uff0c\u4fbf\u6703\u767c\u9001\u8acb\u6c42\u4f86\u53d6\u5f97\n    <ul>\n      <li>\u4f8b\u5982 HTML \u6a19\u7c64\uff1a<code class=\"highlighter-rouge\">&lt;link&gt;<\/code>\u3001<code class=\"highlighter-rouge\">&lt;script&gt;<\/code>\u3001<code class=\"highlighter-rouge\">&lt;img&gt;<\/code> \u7b49<\/li>\n      <li>\u958b\u59cb\u8acb\u6c42 JavaScript \u6a94\u6848\u6642\uff0c\u4fbf\u6703\u56e0\u70ba\u300c\u7981\u6b62\u5256\u6790\u5668\uff08parser blocking\uff09\u300d\u800c\u7acb\u5373\u505c\u6b62\u5efa\u69cb DOM\uff0c\u76f4\u5230 JS \u57f7\u884c\u5b8c\u7562\u624d\u6703\u7e7c\u7e8c<\/li>\n      <li>\u4f46\u5373\u4f7f\u5148\u8acb\u6c42 JS \u8cc7\u6e90\uff0c\u700f\u89bd\u5668\u9084\u662f\u53ef\u4ee5\u4e0d\u53d7 parser blocking \u7684\u5f71\u97ff\uff0c\u7dca\u63a5\u8457\u767c\u9001\u8acb\u6c42 CSS\u3002\u9019\u662f\u56e0\u70ba\u700f\u89bd\u5668\u6709 Preload Scanner \u6a5f\u5236\uff0c\u53ef\u4ee5\u4e8b\u5148\u627e\u5230\u9700\u8981\u8acb\u6c42\u7684\u8cc7\u6e90\u6a94\u6848<\/li>\n    <\/ul>\n  <\/li>\n  <li>\u53d6\u5f97 CSS \u5f8c\uff0c\u700f\u89bd\u5668\u5373\u6703\u89e3\u6790\u3001\u5efa\u7acb CSSOM\uff08CSS Object Model\uff09\n    <ul>\n      <li>Bytes -&gt; Characters -&gt; Tokens -&gt; Nodes -&gt; CSSOM<\/li>\n      <li>\u82e5 CSSOM \u5c1a\u672a\u5efa\u69cb\u5b8c\u7562\uff0c\u6703\u7b49\u5f85 CSSOM \u5b8c\u6210\u5f8c\u624d\u57f7\u884c JavaScript\uff08\u82e5 <code class=\"highlighter-rouge\">&lt;script&gt;<\/code> \u6a19\u7c64\u5728 CSS \u4e4b\u5f8c\u5247\u4e0d\u53d7\u6b64\u9650\u5236\u5f71\u97ff\uff09<\/li>\n    <\/ul>\n  <\/li>\n  <li>\u53d6\u5f97 JavaScript \u5f8c\uff0c\u700f\u89bd\u5668\u958b\u59cb\u57f7\u884c JS \u6642\u6703\u66ab\u6642\u505c\u6b62\u5efa\u69cb DOM\uff08\u540c\u524d\u9762\u6240\u8ff0\u4e4b parser blocking\uff09<\/li>\n  <li>\u5efa\u7acb\u8f49\u8b6f\u6a39\u72c0\u7d50\u69cb\uff08Render Tree\uff09<\/li>\n  <li>\u700f\u89bd\u5668\u4f9d\u64da Render Tree \u9032\u884c\u8a08\u7b97\u5f8c\uff0c\u518d\u7e6a\u88fd\u51fa\u7db2\u9801\u756b\u9762<\/li>\n<\/ol>\n\n<h3 id=\"dom\">DOM<\/h3>\n<ul>\n  <li>\u6587\u4ef6\u7269\u4ef6\u6a21\u578b\uff08DOM\uff0cDocument Object Model\uff09\u70ba HTML \u6240\u6709\u5143\u7d20\u7684\u968e\u5c64\u7d50\u69cb\u6a39\u72c0\u6a21\u578b<\/li>\n  <li>DOM \u4e0d\u6703\u99ac\u4e0a\u5efa\u7acb\u5b8c\u7562\uff0c\u800c\u662f\u9010\u6b65\u5efa\u7acb<\/li>\n  <li>\u5728\u5efa\u7acb DOM \u6642\uff0c\u9047\u5230\u9700\u8981\u7684\u8cc7\u6e90\uff08JavaScript\u3001CSS\u3001\u5716\u7247\u7b49\uff09\u4fbf\u540c\u6642\u767c\u51fa\u8acb\u6c42\u53d6\u5f97\u76f8\u95dc\u8cc7\u6e90<\/li>\n<\/ul>\n\n<div class=\"language-xml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\n<span class=\"nt\">&lt;html<\/span> <span class=\"na\">lang=<\/span><span class=\"s\">\"zh-Hant-TW\"<\/span><span class=\"nt\">&gt;<\/span>\n  <span class=\"nt\">&lt;head&gt;<\/span>\n    <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">charset=<\/span><span class=\"s\">\"UTF-8\"<\/span><span class=\"nt\">&gt;<\/span>\n    <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"viewport\"<\/span> <span class=\"na\">content=<\/span><span class=\"s\">\"width=device-width, initial-scale=1, minimum-scale=1, user-scalable=0\"<\/span><span class=\"nt\">&gt;<\/span>\n    <span class=\"nt\">&lt;title&gt;<\/span>Example<span class=\"nt\">&lt;\/title&gt;<\/span>\n    <span class=\"nt\">&lt;link<\/span> <span class=\"na\">rel=<\/span><span class=\"s\">\"stylesheet\"<\/span> <span class=\"na\">href=<\/span><span class=\"s\">\"style.css\"<\/span><span class=\"nt\">&gt;<\/span>\n  <span class=\"nt\">&lt;\/head&gt;<\/span>\n  <span class=\"nt\">&lt;body&gt;<\/span>\n    <span class=\"nt\">&lt;p&gt;<\/span>Hello World!<span class=\"nt\">&lt;\/p&gt;<\/span>\n    <span class=\"nt\">&lt;div&gt;<\/span>\n      <span class=\"nt\">&lt;span&gt;<\/span>Image version:<span class=\"nt\">&lt;\/span&gt;<\/span>\n      <span class=\"nt\">&lt;img<\/span> <span class=\"na\">src=<\/span><span class=\"s\">\"image.jpg\"<\/span><span class=\"nt\">&gt;<\/span>\n    <span class=\"nt\">&lt;\/div&gt;<\/span>\n    <span class=\"nt\">&lt;script<\/span> <span class=\"na\">src=<\/span><span class=\"s\">\"script.js\"<\/span><span class=\"nt\">&gt;&lt;\/script&gt;<\/span>\n  <span class=\"nt\">&lt;\/body&gt;<\/span>\n<span class=\"nt\">&lt;\/html&gt;<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p><img src=\"\/assets\/images\/dom.png\" alt=\"Document Object Model\" \/><\/p>\n\n<h3 id=\"cssom\">CSSOM<\/h3>\n<ul>\n  <li>\u700f\u89bd\u5668\u6703\u89e3\u6790\u6240\u6709 CSS \u6a23\u5f0f\u898f\u5247\uff0c\u4e26\u4ee5\u5176\u9078\u64c7\u5668\u968e\u5c64\u53bb\u5efa\u7acb\u6a23\u5f0f\u898f\u5247\u7684\u6a39\u72c0\u7d50\u69cb\uff08\u5373\u7528\u6bcf\u4e00\u689d CSS \u6a23\u5f0f\u898f\u5247\u8a2d\u5b9a\u7684\u9078\u64c7\u5668\uff0c\u5efa\u7acb\u6240\u6709\u6a23\u5f0f\u898f\u5247\u7684\u7e7c\u627f\u758a\u5c64\uff09<\/li>\n  <li>CSSOM \u4e2d\u53ea\u6709 CSS \u6a23\u5f0f\u898f\u5247\uff0c\u4e26\u4e0d\u5305\u542b HTML \u5143\u7d20<\/li>\n  <li>\u5728 CSSOM \u5efa\u7acb\u524d\uff0cJavaScript \u662f\u7121\u6cd5\u57f7\u884c\u7684\uff08\u9664\u975e\u5916\u90e8 JS \u4ee5 <code class=\"highlighter-rouge\">async<\/code> \u65b9\u5f0f\u8f09\u5165\uff0c\u6216 JS \u8f03 CSS \u5148\u884c\u5f15\u5165\uff09<\/li>\n<\/ul>\n\n<div class=\"language-css highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nt\">p<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">color<\/span><span class=\"p\">:<\/span> <span class=\"no\">red<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"nt\">div<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">color<\/span><span class=\"p\">:<\/span> <span class=\"no\">blue<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"nt\">div<\/span> <span class=\"nt\">span<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">font-size<\/span><span class=\"p\">:<\/span> <span class=\"m\">16px<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"nt\">img<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">float<\/span><span class=\"p\">:<\/span> <span class=\"nb\">right<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p><img src=\"\/assets\/images\/cssom.png\" alt=\"CSS Object Model\" \/><\/p>\n\n<h3 id=\"render-tree\">Render Tree<\/h3>\n<ul>\n  <li>\u8f49\u8b6f\u6a39\u72c0\u7d50\u69cb\uff08Render Tree\uff09\u70ba\u4e00\u500b\u7531\u5728\u9801\u9762\u5e03\u5c40\uff08layout\uff09\u4e2d\u5be6\u969b\u4f54\u4f4d\u7684 DOM \u5143\u7d20\u95dc\u9023\u5230 CSSOM \u7684\u6a39\u72c0\u7d50\u69cb\u6a21\u578b<\/li>\n  <li>HTML \u548c CSS \u90fd\u662f\u6703\u5f71\u97ff Render Tree \u7684\u8cc7\u6e90\uff0c\u5728 DOM \u53ca CSSOM \u5efa\u69cb\u5b8c\u6210\u4e4b\u524d\uff0c\u7686\u6703\u56e0\u300c\u7981\u6b62\u8f49\u8b6f\uff08render blocking\uff09\u300d\u800c\u7981\u6b62\u700f\u89bd\u5668\u5efa\u69cb Render Tree<\/li>\n  <li>\u700f\u89bd\u5668\u5728\u95dc\u9023 DOM \u8207 CSSOM \u6642\uff0c\u662f\u4ee5 CSS \u9078\u64c7\u5668\uff08CSS Selector\uff09\u300c\u53f3\u5230\u5de6\u300d\u7684\u65b9\u5411\u4f86\u63d0\u9ad8\u6548\u7387\u3002\u5982 <code class=\"highlighter-rouge\">div p span<\/code>\uff0c\u662f\u76f4\u63a5\u5c0b\u627e <code class=\"highlighter-rouge\">span<\/code> \u518d\u6aa2\u67e5\u5176\u7956\u5148\uff08ancestor\uff09\u662f\u5426\u70ba <code class=\"highlighter-rouge\">p<\/code>\u3001<code class=\"highlighter-rouge\">div<\/code>\uff09<\/li>\n  <li>\u6bcf\u500b\u6703\u986f\u793a\u51fa\u4f86\u7684 DOM \u5143\u7d20\u7686\u4ee5\u4e00\u500b\u50cf\u65b9\u584a\u76d2\u5b50\u822c\u7684\u65b9\u5f0f\u5448\u73fe\uff0c\u800c\u6bcf\u4e00\u500b\u76d2\u5b50\u5c31\u662f\u4e00\u500b\u8868\u793a\u4f4d\u7f6e\u3001\u5927\u5c0f\u3001\u984f\u8272\u7b49\u7b49\u986f\u793a\u8cc7\u8a0a\u7684\u7269\u4ef6\u6a21\u578b\uff08\u6b64\u6a21\u578b WebKit \u7a31\u70ba\uff1aRenderer\u3001Gecko \u5247\u53eb\uff1aFrame\uff09<\/li>\n  <li>\u5be6\u969b\u8981\u7e6a\u88fd\uff08painting \u6216\u7a31\u70ba rasterizing\uff09\u7db2\u9801\u756b\u9762\u4e4b\u524d\uff0c\u700f\u89bd\u5668\u6703\u4f9d\u7167 Render Tree \u4e2d\u7269\u4ef6\u6a21\u578b\u7684\u986f\u793a\u8cc7\u8a0a\u8a08\u7b97\u5be6\u969b\u5ea7\u6a19\u5e7e\u4f55\u8cc7\u8a0a\u3001\u50cf\u7d20\u5927\u5c0f\u7b49\uff08\u6b64\u52d5\u4f5c WebKit \u7a31\u70ba\uff1aLayout\u3001Gecko \u5247\u53eb\uff1aReflow\uff09<\/li>\n<\/ul>\n\n<p><img src=\"\/assets\/images\/render_tree.png\" alt=\"Render Tree\" \/><\/p>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"https:\/\/developers.google.com\/web\/fundamentals\/performance\/critical-rendering-path\/?hl=zh-tw\">Google Developers Web Fundamentals - \u95dc\u9375\u8f49\u8b6f\u8def\u5f91<\/a><\/li>\n  <li><a href=\"http:\/\/ithelp.ithome.com.tw\/articles\/10187285\">30 \u5929 Progressive Web App \u5b78\u7fd2\u7b46\u8a18 - Critical Render Path<\/a><\/li>\n  <li><a href=\"https:\/\/developers.google.com\/speed\/articles\/reflow?hl=zh-tw\">Google Developers PageSpeed Tools Insights - Minimizing browser reflow<\/a><\/li>\n<\/ul>\n","pubDate":"Fri, 31 Mar 2017 00:00:00 +0000"},{"title":"\u4ee5 fish \u505a\u70ba\u9810\u8a2d\u7684 shell","link":"\/2017\/02\/27\/fish-shell.html","guid":"\/2017\/02\/27\/fish-shell.html","description":"<p><a href=\"https:\/\/fishshell.com\/\">fish shell<\/a> \u662f\u53ef\u4ee5\u4ee3\u66ff macOS \u9810\u8a2d bash \u7684\u53e6\u4e00\u500b shell \u9078\u64c7\u3002fish \u6709\u8a9e\u6cd5\u9ad8\u4eae\uff08syntax highlighting\uff09\u4ee5\u53ca\u6307\u4ee4\u63d0\u793a\u7b49\u529f\u80fd\uff0c\u5c0d\u5e38\u4f7f\u7528 CLI \u7684\u958b\u767c\u8005\u4f86\u8aaa\u76f8\u7576\u4fbf\u5229\u3002<\/p>\n\n<h2 id=\"\u5b89\u88dd-iterm2\">\u5b89\u88dd iTerm2<\/h2>\n<p>\u7531\u65bc macOS \u9810\u8a2d\u7684 Terminal \u7d42\u7aef\u6a5f\u904e\u65bc\u967d\u6625\uff0c\u6240\u4ee5\u6211\u5011\u4f7f\u7528 <a href=\"https:\/\/www.iterm2.com\/\">iTerm2<\/a> \u4f86\u642d\u914d fish shell\u3002<\/p>\n\n<p>\u4f7f\u7528 <a href=\"https:\/\/caskroom.github.io\/\">Homebrew Cask<\/a> \u5b89\u88dd iTerm2\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew cask install iterm2\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u5b89\u88dd-fish-shell\">\u5b89\u88dd fish shell<\/h2>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew install fish\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u5c07-fish-\u8a2d\u70ba\u9810\u8a2d-shell\">\u5c07 fish \u8a2d\u70ba\u9810\u8a2d shell<\/h2>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"\/usr\/local\/bin\/fish\"<\/span> | <span class=\"nb\">sudo <\/span>tee <span class=\"nt\">-a<\/span> \/etc\/shells\n<span class=\"nv\">$ <\/span>chsh <span class=\"nt\">-s<\/span> \/usr\/local\/bin\/fish\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u53ea\u5728-iterm2-\u4e2d\u4f7f\u7528-fish\">\u53ea\u5728 iTerm2 \u4e2d\u4f7f\u7528 fish<\/h3>\n<p>\u5982\u679c\u53ea\u60f3\u5728 iTerm2 \u4e2d\u4f7f\u7528 fish\uff0c\u53ef\u4ee5\u5728\uff1a<\/p>\n\n<p>iTerm 2 -&gt; Preferences -&gt; Profiles -&gt; General<\/p>\n\n<p>\u8a2d\u5b9a Command \u70ba \/usr\/local\/bin\/fish<\/p>\n\n<h3 id=\"\u5c07\u9810\u8a2d-shell-\u6539\u56de-bash\">\u5c07\u9810\u8a2d shell \u6539\u56de bash<\/h3>\n<p>\u82e5\u8981\u5c07\u9810\u8a2d shell \u5f9e fish \u6539\u56de bash\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>chsh <span class=\"nt\">-s<\/span> \/bin\/bash\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u8a2d\u5b9a-iterm2-\u986f\u793a\u984f\u8272\">\u8a2d\u5b9a iTerm2 \u986f\u793a\u984f\u8272<\/h2>\n<p>iTerm 2 -&gt; Preferences -&gt; Profiles -&gt; Colors<\/p>\n\n<p>\u9078\u64c7 Color Presets\u2026 \u70ba Solarized Dark<\/p>\n\n<h2 id=\"\u8a2d\u5b9a-fish-shell-\u74b0\u5883\u8b8a\u6578\">\u8a2d\u5b9a fish shell \u74b0\u5883\u8b8a\u6578<\/h2>\n<p>\u7531\u65bc fish \u4e26\u4e0d\u76f8\u5bb9 bash\uff0c\u6240\u4ee5\u74b0\u5883\u8b8a\u6578\u7684\u8a2d\u5b9a\u4e5f\u4e0d\u592a\u4e00\u6a23\u3002<\/p>\n\n<p>\u9019\u88e1\u4ee5 <a href=\"https:\/\/golang.org\/\">Go<\/a> \u505a\u70ba\u7bc4\u4f8b\uff0c\u539f\u672c\u5728 bash \u7684 <code class=\"highlighter-rouge\">GOPATH<\/code> \u74b0\u5883\u8b8a\u6578\u8a2d\u5b9a\u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"export GOPATH=<\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/go\"<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.bash_profile\n<span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"export PATH=<\/span><span class=\"nv\">$PATH<\/span><span class=\"s2\">:<\/span><span class=\"nv\">$GOPATH<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.bash_profile\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5728 fish \u5247\u662f\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"set -g -x GOPATH <\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/go\"<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.config\/fish\/config.fish\n<span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"set -g -x PATH <\/span><span class=\"nv\">$PATH<\/span><span class=\"s2\"> <\/span><span class=\"nv\">$GOPATH<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.config\/fish\/config.fish\n<\/code><\/pre><\/div><\/div>\n\n<p>\u8a2d\u5b9a\u5b8c\u7562\u5f8c\u91cd\u65b0\u8f09\u5165 fish shell \u8a2d\u5b9a\u6a94\u5373\u53ef\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> ~\/.config\/fish\/config.fish\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u8a2d\u5b9a-fish-shell-\u914d\u8272\u53ca\u63d0\u793a\">\u8a2d\u5b9a fish shell \u914d\u8272\u53ca\u63d0\u793a<\/h2>\n<p>fish \u5167\u5efa\u591a\u7a2e\u914d\u8272\u4ee5\u53ca\u63d0\u793a\u529f\u80fd\uff0c\u82e5\u6709\u4f7f\u7528 Git \u9084\u53ef\u4ee5\u76f4\u63a5\u770b\u5230\u76ee\u524d\u6240\u5728\u7684\u5206\u652f\u540d\u7a31\u3001\u6a94\u6848\u7570\u52d5\u72c0\u614b\u7b49\u8cc7\u8a0a\u3002<\/p>\n\n<p>\u958b\u555f fish shell \u7684\u8a2d\u5b9a\u9801\u9762\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>fish_config\n<\/code><\/pre><\/div><\/div>\n\n<p>\u203b\u9ede\u9078 Set \u6309\u9215\u4e4b\u5f8c\u8acb\u7b49\u5f85\u9ede\u79d2\u9418\uff0c\u770b\u5230 Set! \u624d\u4ee3\u8868\u8a2d\u5b9a\u6210\u529f\u3002\u5b8c\u6210\u8a2d\u5b9a\u5f8c\uff0c\u9808\u5728 CLI \u6309\u4e0b Enter \u7d50\u675f\u3002<\/p>\n\n<h2 id=\"\u89e3\u6c7a-nvm-\u7121\u6cd5\u5728-fish-shell-\u4e0b\u57f7\u884c\u554f\u984c\">\u89e3\u6c7a NVM \u7121\u6cd5\u5728 fish shell \u4e0b\u57f7\u884c\u554f\u984c<\/h2>\n<p>\u540c\u6a23\u56e0\u70ba fish \u4e0d\u76f8\u5bb9 bash\uff0c\u4e5f\u5c0e\u81f4 NVM \u4e2d\u7684 nvm.sh \u7121\u6cd5\u6b63\u5e38\u5728 fish \u4e2d\u57f7\u884c\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e fish \u7684\u5957\u4ef6\u7ba1\u7406\u5de5\u5177\u2014<a href=\"https:\/\/fisherman.github.io\/\">fisherman<\/a> \u4f86\u5b89\u88dd <a href=\"https:\/\/github.com\/fisherman\/nvm\">Fish-nvm<\/a> \u4ee5\u652f\u63f4 NVM\u3002<\/p>\n\n<p>\u5047\u8a2d\u5df2\u900f\u904e Homebrew \u5b89\u88dd\u5b8c NVM\uff0c\u63a5\u8457\u5b89\u88dd fisherman\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>curl <span class=\"nt\">-Lo<\/span> ~\/.config\/fish\/functions\/fisher.fish <span class=\"nt\">--create-dirs<\/span> git.io\/fisher\n<\/code><\/pre><\/div><\/div>\n\n<p>\u900f\u904e fisherman \u5b89\u88dd Fish-nvm\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>fisher nvm\n<\/code><\/pre><\/div><\/div>\n\n<p>\u5efa\u7acb symbolic link \u6307\u5411\u7531 Homebrew \u6240\u5b89\u88dd NVM \u7684 nvm.sh\uff0c\u8b93 Fish-nvm \u80fd\u5920\u627e\u5230\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>ln <span class=\"nt\">-s<\/span> <span class=\"o\">(<\/span>brew <span class=\"nt\">--prefix<\/span> nvm<span class=\"o\">)<\/span>\/nvm.sh ~\/.nvm\/nvm.sh\n<\/code><\/pre><\/div><\/div>\n\n<p>\u8a2d\u5b9a NVM \u7684 <code class=\"highlighter-rouge\">NVM_DIR<\/code> \u74b0\u5883\u8b8a\u6578\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"set -g -x NVM_DIR <\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/.nvm\"<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.config\/fish\/config.fish\n<\/code><\/pre><\/div><\/div>\n\n<p>\u6700\u5f8c\uff0c\u70ba\u4e86\u8b93 npm \u5b89\u88dd\u7684\u5168\u57df\u5957\u4ef6\u53ef\u4ee5\u6b63\u5e38\u4f7f\u7528\uff08\u5982\uff1a<code class=\"highlighter-rouge\">webpack<\/code>\u3001<code class=\"highlighter-rouge\">flow<\/code> \u7b49\u6307\u4ee4\uff09\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"bass source <\/span><span class=\"nv\">$NVM_DIR<\/span><span class=\"s2\">\/nvm.sh\"<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.config\/fish\/config.fish\n<\/code><\/pre><\/div><\/div>\n\n<p>\u203b\u82e5\u662f\u6c92\u6709\u52a0\u5165\u6b64\u8a2d\u5b9a\uff0c\u5247\u5728\u57f7\u884c <code class=\"highlighter-rouge\">node<\/code> \u6216 <code class=\"highlighter-rouge\">npm<\/code> \u4e4b\u524d\uff0c\u5168\u57df\u5957\u4ef6\u7684\u6307\u4ee4\u6703\u7121\u6cd5\u4f7f\u7528<\/p>\n\n<h2 id=\"\u5728-fish-shell-\u4e2d\u57f7\u884c-bash-script\">\u5728 fish shell \u4e2d\u57f7\u884c bash script<\/h2>\n\n<p>\u96d6\u7136 fish \u4e26\u4e0d\u76f8\u5bb9 bash\uff0c\u4f46\u4ecd\u53ef\u900f\u904e <a href=\"https:\/\/github.com\/edc\/bass\">Bass<\/a> \u4f86\u57f7\u884c bash script\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>bass <span class=\"nb\">export <\/span><span class=\"nv\">X<\/span><span class=\"o\">=<\/span>3\n<\/code><\/pre><\/div><\/div>\n","pubDate":"Mon, 27 Feb 2017 00:00:00 +0000"},{"title":"\u5efa\u7acb\u57fa\u672c\u7684 ES6 \u5c08\u6848","link":"\/2017\/02\/24\/simple-es6-project.html","guid":"\/2017\/02\/24\/simple-es6-project.html","description":"<p>ECMAScript 2015 \u6b63\u5f0f\u7248\u672c\u5df2\u7d93\u63a8\u51fa\u4e00\u5e74\u591a\u4e86\uff0c\u96d6\u7136\u5404\u5927\u700f\u89bd\u5668\u5c1a\u672a\u5b8c\u5168\u652f\u63f4\uff0c\u4f46\u662f\u6211\u5011\u4ecd\u53ef\u4ee5\u900f\u904e npm \u5efa\u7acb\u5c08\u6848\uff0c\u518d\u642d\u914d webpack\u3001Babel \u7b49\u5de5\u5177\u4f86\u8f14\u52a9\u958b\u767c\u3002<\/p>\n\n<h2 id=\"\u5efa\u7acb\u5c08\u6848\u76ee\u9304\">\u5efa\u7acb\u5c08\u6848\u76ee\u9304<\/h2>\n<p>\u5efa\u7acb\u5c08\u6848\u5c08\u6848\u76ee\u9304\uff0c\u4e26\u5efa\u7acb\u5b50\u76ee\u9304 src\uff1a<\/p>\n<ul>\n  <li>dist \u70ba\u958b\u767c\u5b8c\u7562\u6642\u8981\u767c\u5e03\u7684\u6a94\u6848\u6240\u5728\u76ee\u9304\uff0c\u653e\u7f6e HTML\u3001CSS \u4ee5\u53ca\u8f49\u8b6f\u5f8c JavaScript<\/li>\n  <li>src \u5247\u662f\u64b0\u5beb ES6 \u7684\u958b\u767c\u76ee\u9304<\/li>\n<\/ul>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>project\n\u2514\u2500\u2500 src\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u5efa\u7acb-npm-\u5c08\u6848\">\u5efa\u7acb npm \u5c08\u6848<\/h2>\n<p>\u65bc\u5c08\u6848\u76ee\u4e2d\u8f38\u5165\u6307\u4ee4\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm init\n<\/code><\/pre><\/div><\/div>\n\n<p>\u4f9d\u63d0\u793a\u8aaa\u660e\u7684\u6b65\u9a5f\u5efa\u7acb package.json \u8a2d\u5b9a\u6a94\u3002<\/p>\n\n<h2 id=\"\u5b89\u88dd-webpack-\u53ca\u958b\u767c\u4f3a\u670d\u5668\">\u5b89\u88dd webpack \u53ca\u958b\u767c\u4f3a\u670d\u5668<\/h2>\n<p>\u9019\u88e1\u6211\u5011\u76f4\u63a5\u5b89\u88dd webpack 3\uff0c\u5148\u4f7f\u7528 <code class=\"highlighter-rouge\">npm install<\/code> \u52a0\u4e0a <code class=\"highlighter-rouge\">--global<\/code> \u6216 <code class=\"highlighter-rouge\">-g<\/code> \u53c3\u6578\u5c07 webpack\u3001webpack Dev Server \u5b89\u88dd\u81f3\u5168\u57df\u4e2d\uff0c\u4ee5\u4fbf\u6211\u5011\u4f7f\u7528 <code class=\"highlighter-rouge\">webpack<\/code> \u6307\u4ee4\uff08\u5df2\u5b89\u88dd\u53ef\u7701\u7565\uff09\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install webpack <span class=\"nt\">--global<\/span>\n<span class=\"nv\">$ <\/span>npm install webpack-dev-server <span class=\"nt\">--global<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u203b<code class=\"highlighter-rouge\">npm install<\/code> \u53ef\u5077\u61f6\u7c21\u5beb\u6210 <code class=\"highlighter-rouge\">npm i<\/code><\/p>\n\n<p>\u518d\u642d\u914d <code class=\"highlighter-rouge\">--save-dev<\/code> \u6216 <code class=\"highlighter-rouge\">-D<\/code> \u53c3\u6578\uff08\u5f85\u4e0b\u65b9\u8aaa\u660e\uff09\u5b89\u88dd\u81f3\u5c08\u6848\u76ee\u9304\u4e2d\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install webpack <span class=\"nt\">--save-dev<\/span>\n<span class=\"nv\">$ <\/span>npm install webpack-dev-server <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u5b89\u88dd-htmlwebpackplugin\">\u5b89\u88dd HtmlwebpackPlugin<\/h2>\n<p>\u642d\u914d <code class=\"highlighter-rouge\">--save-dev<\/code> \u6216 <code class=\"highlighter-rouge\">-D<\/code> \u53c3\u6578\u5b89\u88dd\u81f3\u5c08\u6848\u76ee\u9304\u4e2d\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install html-webpack-plugin <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u5b89\u88dd-babel-\u53ca-es6-\u652f\u63f4\">\u5b89\u88dd Babel \u53ca ES6 \u652f\u63f4<\/h2>\n<p>\u642d\u914d <code class=\"highlighter-rouge\">--save-dev<\/code> \u6216 <code class=\"highlighter-rouge\">-D<\/code> \u53c3\u6578\u5b89\u88dd\u81f3\u5c08\u6848\u76ee\u9304\u4e2d\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install babel-loader <span class=\"nt\">--save-dev<\/span>\n<span class=\"nv\">$ <\/span>npm install babel-core <span class=\"nt\">--save-dev<\/span>\n<span class=\"nv\">$ <\/span>npm install babel-preset-es2015 <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\u76f8\u4f9d\u5957\u4ef6\">\u76f8\u4f9d\u5957\u4ef6<\/h2>\n<p><code class=\"highlighter-rouge\">npm install<\/code> \u7684 <code class=\"highlighter-rouge\">--save-dev<\/code> \u53c3\u6578\uff08\u7c21\u5beb\u70ba <code class=\"highlighter-rouge\">-D<\/code>\uff09\u9664\u4e86\u5b89\u88dd\u5957\u4ef6\u5916\uff0c\u540c\u6642\u4e5f\u6703\u65bc package.json \u4e2d\u5c07\u5b89\u88dd\u7684\u5957\u4ef6\u52a0\u5165\u70ba\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff08package.json \u4e2d\u7684 <code class=\"highlighter-rouge\">devDependencies<\/code> \u5c6c\u6027\uff09\u3002\u5982\u679c\u50c5\u7528 <code class=\"highlighter-rouge\">npm install [package]<\/code> \u800c\u672a\u52a0\u53c3\u6578\uff0c\u5247\u53ea\u6703\u55ae\u7d14\u7684\u5c07\u5957\u4ef6\u5b89\u88dd\u81f3\u5c08\u6848\u4e2d\u7684 node_modules \u76ee\u9304\u3002<\/p>\n\n<p>\u53e6\u5916\uff0c\u5982\u679c\u5c08\u6848\u4e2d\u6709\u4f7f\u7528\u5916\u90e8\u5957\u4ef6\uff08\u5982\uff1aReact\uff09\uff0c\u5247\u53ef\u4ee5\u4f7f\u7528 <code class=\"highlighter-rouge\">--save<\/code> \u53c3\u6578\u4f86\u5b89\u88dd\u4e26\u52a0\u5165\u70ba\u6b63\u5f0f\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff08package.json \u4e2d\u7684 <code class=\"highlighter-rouge\">dependencies<\/code> \u5c6c\u6027\uff09\u3002<\/p>\n\n<p>\u203b\u5f9e npm 5 \u958b\u59cb\uff0c<code class=\"highlighter-rouge\">npm install [package]<\/code> \u9810\u8a2d\u5373\u5b89\u88dd\u70ba\u6b63\u5f0f\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff0c\u56e0\u6b64\u53ef\u7701\u7565 <code class=\"highlighter-rouge\">--save<\/code> \u53c3\u6578<\/p>\n\n<p><code class=\"highlighter-rouge\">devDependencies<\/code> \u8207 <code class=\"highlighter-rouge\">dependencies<\/code> \u7684\u5dee\u5225\u5728\u65bc\uff1a<\/p>\n<ul>\n  <li><code class=\"highlighter-rouge\">devDependencies<\/code>\uff1a\u50c5\u958b\u767c\u6642\u4f7f\u7528<\/li>\n  <li><code class=\"highlighter-rouge\">dependencies<\/code>\uff1a\u958b\u767c\u6642\u671f\u53ca\u6b63\u5f0f\u7522\u54c1\u7686\u9808\u8981\u4f7f\u7528<\/li>\n<\/ul>\n\n<p>\u53ea\u8981\u6709\u8a2d\u5b9a\u597d\u76f8\u4f9d\u5957\u4ef6\u5c6c\u6027\u7684 package.json\uff0c\u5373\u53ef\u900f\u904e <code class=\"highlighter-rouge\">npm install<\/code> \u518d\u6b21\u5b89\u88dd\u958b\u767c\u53ca\u6b63\u5f0f\u74b0\u5883\u4f9d\u8cf4\u7684\u6240\u6709\u5957\u4ef6\u3002<\/p>\n\n<p>\u203b\u5f9e npm 5 \u958b\u59cb\uff0c\u6703\u81ea\u52d5\u5efa\u7acb package-lock.json \u6a94\u6848\u4f86\u8a18\u9304\u5957\u4ef6\u7684\u76f8\u4f9d\u8cc7\u8a0a\uff0c\u4e26\u4e14\u6703\u512a\u5148\u4ee5\u6b64\u7d00\u9304\u7684\u5957\u4ef6\u8cc7\u8a0a\u4f86\u5b89\u88dd\uff0c\u907f\u514d\u6bcf\u4e00\u6b21 <code class=\"highlighter-rouge\">npm install<\/code> \u6642\u90fd\u8981\u91cd\u65b0\u5206\u6790\u6bcf\u4e00\u500b\u5957\u4ef6\u7684\u4f9d\u8cf4\u95dc\u4fc2\uff0c\u4e5f\u964d\u4f4e\u4e86\u56e0\u7248\u672c\u7bc4\u570d\u800c\u5b89\u88dd\u5230\u6b21\u7248\u865f\u6216\u4fee\u8a02\u865f\u4e4b\u66f4\u65b0\u7248\u672c\u5957\u4ef6\u5c0e\u81f4\u4e0d\u53ef\u9810\u671f\u932f\u8aa4\u7684\u6a5f\u7387\u3002\u56e0\u6b64\u4e5f\u8981\u907f\u514d\u624b\u52d5\u4fee\u6539 package.json \u4e2d\u7684\u5c08\u6848\u4f9d\u8cf4\u5957\u4ef6\uff0c\u61c9\u4f7f\u7528\u6307\u4ee4\u64cd\u4f5c\u4f86\u7ba1\u7406\u5c08\u6848\u5957\u4ef6\uff0c\u7531 npm \u7dad\u8b77\u5c08\u6848\u4f9d\u8cf4\u5957\u4ef6\u8cc7\u8a0a<\/p>\n\n<h2 id=\"\u5efa\u7acb\u8a2d\u5b9a\u6a94\u6848\">\u5efa\u7acb\u8a2d\u5b9a\u6a94\u6848<\/h2>\n<p>\u73fe\u5728\u5c08\u6848\u76ee\u9304\u4e2d\u591a\u4e86 package.json \u8a2d\u5b9a\u6a94\uff0c\u4ee5\u53ca\u653e\u7f6e\u5b89\u88dd\u5957\u4ef6\u7684 node_modules \u76ee\u9304\u3002\u63a5\u4e0b\u4f86\u8981\u5728\u5c08\u6848\u76ee\u9304\u4e0b\u5efa\u7acb\uff1awebpack.config.js\u3001.babelrc\u3001.gitignore \u8a2d\u5b9a\u6a94\u3002<\/p>\n\n<p>\u203b\u5f9e npm 5 \u958b\u59cb\uff0c\u6703\u5c07 node_modules \u76ee\u9304\u4e2d\u6240\u6709\u5957\u4ef6\u7684\u76f8\u95dc\u8cc7\u8a0a\u8a18\u9304\u5728 package-lock.json\u3002\u672a\u4f86\u82e5\u8981\u66f4\u65b0\u5957\u4ef6\u81f3\u8de8\u4e3b\u7248\u865f\uff08major version\uff09\u4e4b\u7248\u672c\u5fc5\u9808\u4f7f\u7528 <code class=\"highlighter-rouge\">npm install [package@version]<\/code> \u4f86\u6307\u5b9a\u65b0\u7248\u672c\uff0c\u975e\u4e3b\u7248\u865f\u4e4b\u66f4\u65b0\u5247\u53ef\u4ee5\u4f7f\u7528 <code class=\"highlighter-rouge\">npm update [package]<\/code>\u3002npm \u6703\u81ea\u52d5\u7dad\u8b77 package-lock.json \u6a94\u6848<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>project\n\u251c\u2500\u2500 src\n\u251c\u2500\u2500 node_modules\n\u251c\u2500\u2500 .babelrc\n\u251c\u2500\u2500 .gitignore\n\u251c\u2500\u2500 package-lock.json\n\u251c\u2500\u2500 package.json\n\u2514\u2500\u2500 webpack.config.js\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"webpackconfigjs\">webpack.config.js<\/h3>\n<p>webpack \u5728 version 2 \u4e4b\u5f8c\u7684\u8a2d\u5b9a\u6a94\u8207\u820a\u7248\u4e0d\u540c\uff0c\u8981\u7279\u5225\u6ce8\u610f\uff01<\/p>\n\n<div class=\"language-javascript highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">\/\/ \u8f09\u5165 Node.js \u7684 path \u6a21\u7d44<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">path<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"s1\">'path'<\/span><span class=\"p\">)<\/span>\n<span class=\"c1\">\/\/ \u8f09\u5165 webpack \u6a21\u7d44<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">webpack<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"s1\">'webpack'<\/span><span class=\"p\">)<\/span>\n<span class=\"c1\">\/\/ \u8f09\u5165 HtmlwebpackPlugin \u63d2\u4ef6<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">HtmlwebpackPlugin<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"s1\">'html-webpack-plugin'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"c1\">\/\/ webpack \u8a2d\u5b9a\u503c<\/span>\n<span class=\"c1\">\/\/ \u5b9a\u7fa9\u958b\u767c\u8207\u6b63\u5f0f\u5171\u7528\u7684\u8a2d\u5b9a\u503c<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">webpackConfig<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ \u5c08\u6848\u6839\u76ee\u9304\u8def\u5f91\uff08\u672c\u6a5f\u8def\u5f91\uff0c\u9808\u70ba\u7d55\u5c0d\u8def\u5f91\uff09<\/span>\n  <span class=\"c1\">\/\/ \u9810\u8a2d\u503c\u70ba webpack \u6307\u4ee4\u4f5c\u7528\u7684\u5de5\u4f5c\u76ee\u9304\uff08current working directory, CWD\uff09<\/span>\n  <span class=\"c1\">\/\/ __dirname \u70ba\u6b64 webpack \u8a2d\u5b9a\u6a94\u6a21\u7d44\u7684\u6240\u5728\u76ee\u9304<\/span>\n  <span class=\"na\">context<\/span><span class=\"p\">:<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'src'<\/span><span class=\"p\">),<\/span>\n  <span class=\"c1\">\/\/ Entry\uff08\u9032\u5165\u9ede\uff09\u6a94\u6848\u8def\u5f91\uff08\u57fa\u65bc context\uff09<\/span>\n  <span class=\"c1\">\/\/ \u5c08\u6848\u61c9\u7528\u7a0b\u5f0f\u6703\u7531 Entry \u555f\u52d5\uff0c\u4e26\u5f15\u5165\u4f9d\u8cf4\u6a21\u7d44<\/span>\n  <span class=\"na\">entry<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">index<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'.\/js\/index.js'<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"c1\">\/\/ \u8f38\u51fa\u8a2d\u5b9a<\/span>\n  <span class=\"na\">output<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ \u8f38\u51fa\u6a94\u7684\u76ee\u6a19\u4f4d\u7f6e\uff08\u672c\u6a5f\u8def\u5f91\uff0c\u9808\u70ba\u7d55\u5c0d\u8def\u5f91\uff09<\/span>\n    <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'dist'<\/span><span class=\"p\">),<\/span>\n    <span class=\"c1\">\/\/ \u8f38\u51fa\u6a94\u540d\uff08\u53ef\u5305\u542b\u8def\u5f91\uff09<\/span>\n    <span class=\"na\">filename<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'js\/bundle.js'<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ \u9810\u5b9a\u6240\u6709\u8cc7\u6e90\u6a94\u6848\u6703\u7f6e\u65bc\u4f3a\u670d\u5668\u4e2d\uff08\u901a\u5e38\u70ba CDN\uff09\u7684\u57fa\u790e\u8def\u5f91\uff0c\u5373\u70ba\u5f15\u7528\u975c\u614b\u8cc7\u6e90\u6642\u7684\u6839\u8def\u5f91<\/span>\n    <span class=\"c1\">\/\/ \u958b\u555f Hot-Reload \u6642\uff0c\u6b64\u9078\u9805\u70ba\u5fc5\u8981\u8a2d\u5b9a<\/span>\n    <span class=\"c1\">\/\/ \u56e0 Hot Module Replacement \u9808\u7531\u6b64\u57fa\u790e\u8def\u5f91\u4e0b\u53d6\u5f97\u66f4\u65b0\u7684\u8cc7\u6e90<\/span>\n    <span class=\"na\">publicPath<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'\/'<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"c1\">\/\/ \u6a21\u7d44\u8a2d\u5b9a<\/span>\n  <span class=\"c1\">\/\/ webpack \u5c07\u5c08\u6848\u4e2d\u6240\u6709\u7684\u8cc7\u6e90\uff08asset\uff09\u6a94\u6848\u7686\u8996\u70ba\u6a21\u7d44<\/span>\n  <span class=\"c1\">\/\/ \u5728\u6b64\u8a2d\u5b9a\u5982\u4f55\u8655\u7406\u5c08\u6848\u4e2d\u5404\u7a2e\u4e0d\u540c\u985e\u578b\u7684\u8cc7\u6e90\u6a21\u7d44\uff08\u5373\u6a94\u6848\uff09<\/span>\n  <span class=\"na\">module<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ \u6a21\u7d44\u8655\u7406\u898f\u5247<\/span>\n    <span class=\"na\">rules<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n      <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ \u8cc7\u6e90\u6a94\u6848\u7be9\u9078\u689d\u4ef6<\/span>\n        <span class=\"na\">resource<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"c1\">\/\/ \u9808\u7b26\u5408\u6b63\u5247\u8868\u793a\u6cd5\u689d\u4ef6<\/span>\n          <span class=\"na\">test<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n            <span class=\"c1\">\/\/ \u8868\u793a\u4f5c\u7528\u5728\u6240\u6709 *.js \u6a94\u6848<\/span>\n            <span class=\"sr\">\/<\/span><span class=\"se\">\\.<\/span><span class=\"sr\">js$\/<\/span>\n          <span class=\"p\">],<\/span>\n          <span class=\"c1\">\/\/ \u9808\u6392\u9664\u8def\u5f91\u689d\u4ef6\uff08\u672c\u6a5f\u8def\u5f91\uff0c\u9808\u70ba\u7d55\u5c0d\u8def\u5f91\uff09<\/span>\n          <span class=\"na\">exclude<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n            <span class=\"c1\">\/\/ \u8868\u793a\u6392\u9664\u5c08\u6848\u4e2d\u7684 node_modules \u76ee\u9304<\/span>\n            <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'node_modules'<\/span><span class=\"p\">)<\/span>\n          <span class=\"p\">]<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"c1\">\/\/ \u61c9\u7528\u65bc\u6b64\u8655\u7406\u898f\u5247\u7684 Loaders\uff08\u8f49\u63db\u5668\uff09<\/span>\n        <span class=\"c1\">\/\/ Loader \u53ef\u4ee5\u8f09\u5165\u6307\u5b9a\u7684\u8cc7\u6e90\uff0c\u4e26\u9032\u884c\u8f38\u51fa\u8f49\u63db<\/span>\n        <span class=\"c1\">\/\/ webpack \u672c\u8eab\u53ea\u652f\u63f4 JavaScript \u6a21\u7d44<\/span>\n        <span class=\"c1\">\/\/ \u662f\u85c9\u7531 Loader \u4f86\u652f\u6e90\u5176\u5b83\u4e0d\u540c\u985e\u578b\u7684\u8cc7\u6e90<\/span>\n        <span class=\"c1\">\/\/ \u4f5c\u7528\u7684\u9806\u5e8f\u662f\u7531\u9663\u5217\u4e2d\u6700\u672b\u9805\u7684 Loader \u958b\u59cb\uff0c\u518d\u4f9d\u5e8f\u5f80\u524d<\/span>\n        <span class=\"c1\">\/\/ \u5c07\u8f49\u63db\u904e\u7684\u7d50\u679c\u4ea4\u7531\u524d\u4e00\u9805\u7d22\u5f15\u7684 Loader \u7e7c\u7e8c\u8655\u7406<\/span>\n        <span class=\"c1\">\/\/ Loader \u6700\u5f8c\u6703\u5c07\u8cc7\u6e90\u8f38\u51fa\u70ba\u5b57\u4e32\uff0cwebpack \u518d\u5305\u88dd\u6210 JavaScript \u6a21\u7d44<\/span>\n        <span class=\"na\">use<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n          <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/ Loader \u540d\u7a31\u5728 webpack 2 \u4e4b\u5f8c\u4e0d\u53ef\u7701\u7565 '-loader' \u5f8c\u7db4<\/span>\n            <span class=\"na\">loader<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'babel-loader'<\/span>\n          <span class=\"p\">}<\/span>\n        <span class=\"p\">]<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">]<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"c1\">\/\/ \u63d2\u4ef6<\/span>\n  <span class=\"na\">plugins<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"c1\">\/\/ \u5ba3\u544a\u4e00\u500b\u5168\u57df\u7684\u5e38\u6578\u4e26\u8ce6\u503c\uff0c\u8b93\u9032\u5165\u9ede\u53ca\u5176\u76f8\u4f9d\u7684\u6a21\u7d44\u4f7f\u7528<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nx\">webpack<\/span><span class=\"p\">.<\/span><span class=\"nx\">DefinePlugin<\/span><span class=\"p\">({<\/span>\n      <span class=\"c1\">\/\/ \u5c07 Node.js \u74b0\u5883\u7684 process.env.NODE_ENV \u5ba3\u544a\u70ba\u5168\u57df\u5e38\u6578<\/span>\n      <span class=\"c1\">\/\/ \u8b93\u700f\u89bd\u5668\u74b0\u5883\u4e5f\u53ef\u4ee5\u53d6\u7528 process.env.NODE_ENV<\/span>\n      <span class=\"c1\">\/\/ \u5be6\u969b\u4e0a DefinePlugin \u662f\u4ee5\u76f4\u63a5\u66ff\u63db\u6587\u5b57\u7684\u65b9\u5f0f\u904b\u4f5c<\/span>\n      <span class=\"c1\">\/\/ \u6240\u4ee5\u8ce6\u503c\u7684\u6642\u5019\uff0c\u503c\u82e5\u662f\u5b57\u4e32\u5247\u5beb\u6cd5\u5fc5\u9808\u7279\u5225\u8655\u7406<\/span>\n      <span class=\"s1\">'process.env.NODE_ENV'<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nx\">stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">NODE_ENV<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}),<\/span>\n    <span class=\"c1\">\/\/ \u52d5\u614b\u7522\u751f HTML \u4e26\u81ea\u52d5\u5f15\u5165\u8f38\u51fa\u5f8c\u7684 Entry \u6a94\u6848<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nx\">HtmlwebpackPlugin<\/span><span class=\"p\">({<\/span>\n      <span class=\"c1\">\/\/ \u4f9d\u64da\u7684\u6a21\u677f\u6a94\u6848\u8def\u5f91\uff08\u57fa\u65bc context\uff09<\/span>\n      <span class=\"na\">template<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'.\/index.html'<\/span><span class=\"p\">,<\/span>\n      <span class=\"c1\">\/\/ \u8981\u5f15\u5165\u7684 Entry \u540d\u7a31<\/span>\n      <span class=\"na\">chunks<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"s1\">'index'<\/span><span class=\"p\">]<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">]<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">NODE_ENV<\/span> <span class=\"o\">===<\/span> <span class=\"s1\">'production'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ \u82e5\u8981\u7de8\u8b6f\u6210\u6b63\u5f0f\u7522\u54c1\uff0c\u4f7f\u7528\u4ee5\u4e0b\u8a2d\u5b9a\u503c\uff1a<\/span>\n  <span class=\"c1\">\/\/ \u52a0\u5165\u63d2\u4ef6<\/span>\n  <span class=\"nx\">webpackConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">plugins<\/span><span class=\"p\">.<\/span><span class=\"nx\">push<\/span><span class=\"p\">(<\/span>\n    <span class=\"c1\">\/\/ \u6700\u5c0f\u5316 JavaScript \u6a94\u6848<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nx\">webpack<\/span><span class=\"p\">.<\/span><span class=\"nx\">optimize<\/span><span class=\"p\">.<\/span><span class=\"nx\">UglifyJsPlugin<\/span><span class=\"p\">(),<\/span>\n    <span class=\"c1\">\/\/ \u900f\u904e\u8a08\u7b97\u5f15\u5165\u6a21\u7d44\u53ca chunk\uff08\u7a0b\u5f0f\u78bc\u584a\uff0c\u88ab webpack \u91cd\u65b0\u7d44\u5408\u800c\u6210\u7684\u4e00\u6bb5\u4e00\u6bb5\u7a0b\u5f0f\u78bc\uff09\u7684\u6b21\u6578<\/span>\n    <span class=\"c1\">\/\/ \u9032\u800c\u6e1b\u5c11\u6574\u9ad4\u8f38\u51fa\u6a94\u6848\u7684\u5927\u5c0f<\/span>\n    <span class=\"c1\">\/\/ \u81ea webpack 2 \u958b\u59cb\uff0c\u9810\u8a2d\u70ba\u958b\u555f<\/span>\n    <span class=\"c1\">\/\/ new webpack.optimize.OccurrenceOrderPlugin()<\/span>\n  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ \u958b\u767c\u968e\u6bb5\u57f7\u884c\uff0c\u5247\u4f7f\u7528\u4ee5\u4e0b\u8a2d\u5b9a\u503c\uff1a<\/span>\n  <span class=\"c1\">\/\/ \u7522\u751f\u539f\u59cb\u78bc\u6620\u5c04\u8868\uff08Source Map\uff09\uff0c\u65b9\u4fbf\u958b\u767c\u6642\u9664\u932f<\/span>\n  <span class=\"nx\">webpackConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">devtool<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'cheap-module-eval-source-map'<\/span>\n  <span class=\"c1\">\/\/ webpack Dev Server\uff08WDS\uff09\u8a2d\u5b9a<\/span>\n  <span class=\"nx\">webpackConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">devServer<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ \u4f3a\u670d\u5668\u6839\u76ee\u9304\u4f4d\u7f6e\uff08\u672c\u6a5f\u8def\u5f91\uff0c\u5efa\u8b70\u4f7f\u7528\u7d55\u5c0d\u8def\u5f91\uff09<\/span>\n    <span class=\"na\">contentBase<\/span><span class=\"p\">:<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'dist'<\/span><span class=\"p\">),<\/span>\n    <span class=\"c1\">\/\/ \u958b\u555f inline mode\uff08\u6a94\u6848\u6709\u66f4\u65b0\u6642\u81ea\u52d5\u91cd\u6574\u9801\u9762\uff09<\/span>\n    <span class=\"c1\">\/\/ \u4f7f\u7528 Hot Module Replacement \u6642\u5efa\u8b70\u958b\u555f\u6b64\u6a21\u5f0f<\/span>\n    <span class=\"na\">inline<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ \u958b\u555f Hot-Reload<\/span>\n    <span class=\"c1\">\/\/ \u6a94\u6848\u6709\u66f4\u65b0\u6642\uff0c\u50c5\u71b1\u62bd\u63db\u8a72\u6a21\u7d44\uff08\u652f\u63f4\u7684\u6a94\u6848\u624d\u6709\u6548\u679c\uff09<\/span>\n    <span class=\"c1\">\/\/ \u9808\u642d\u914d Hot Module Replacement \u63d2\u4ef6<\/span>\n    <span class=\"na\">hot<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ \u81ea\u52d5\u958b\u555f\u700f\u89bd\u5668<\/span>\n    <span class=\"na\">open<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">port<\/span><span class=\"p\">:<\/span> <span class=\"mi\">9000<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ \u56e0 webpack DevServer \u904b\u4f5c\u6642<\/span>\n    <span class=\"c1\">\/\/ \u4e26\u4e0d\u6703\u771f\u7684\u7522\u51fa\u8f49\u63db\u5f8c\u7684\u8cc7\u6e90\u6a94\u6848\uff0c\u800c\u662f\u5b58\u653e\u5728\u8a18\u61b6\u9ad4\u4e2d<\/span>\n    <span class=\"c1\">\/\/ \u8a18\u61b6\u9ad4\u4e2d\u7684\u6a94\u6848\uff0c\u5176\u5728 DevServer \u4e0a\u7684\u670d\u52d9\u4f4d\u7f6e\u5373\u5728 devServer.publicPath \u6240\u8a2d\u5b9a\u7684\u8def\u5f91\u4e4b\u4e0b<\/span>\n    <span class=\"c1\">\/\/ \u5efa\u8b70\u8207 output.publicPath \u4e00\u81f4<\/span>\n    <span class=\"c1\">\/\/ \u82e5\u958b\u555f Hot-Reload\uff0c\u5247\u5fc5\u9808\u8207 output.publicPath \u4e00\u81f4\uff0c\u624d\u80fd\u53d6\u5f97\u66f4\u65b0\u7684\u5167\u5bb9<\/span>\n    <span class=\"na\">publicPath<\/span><span class=\"p\">:<\/span> <span class=\"s1\">'\/'<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">stats<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">colors<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"c1\">\/\/ \u52a0\u5165\u63d2\u4ef6<\/span>\n  <span class=\"nx\">webpackConfig<\/span><span class=\"p\">.<\/span><span class=\"nx\">plugins<\/span><span class=\"p\">.<\/span><span class=\"nx\">push<\/span><span class=\"p\">(<\/span>\n    <span class=\"c1\">\/\/ Hot Module Replacement\uff08HMR\uff09<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nx\">webpack<\/span><span class=\"p\">.<\/span><span class=\"nx\">HotModuleReplacementPlugin<\/span><span class=\"p\">(),<\/span>\n    <span class=\"c1\">\/\/ Hot-Reload \u6642\u5728\u700f\u89bd\u5668 Console \u986f\u793a\u66f4\u65b0\u7684\u6a94\u6848\u540d\u7a31<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nx\">webpack<\/span><span class=\"p\">.<\/span><span class=\"nx\">NamedModulesPlugin<\/span><span class=\"p\">()<\/span>\n  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ \u5c07\u5168\u90e8\u8a2d\u5b9a\u8f38\u51fa\u70ba Node.js \u6a21\u7d44\uff0c\u4f9b webpack \u4f7f\u7528<\/span>\n<span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">exports<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">webpackConfig<\/span>\n\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"babelrc\">.babelrc<\/h3>\n<p>Babel \u8a2d\u5b9a\u6a94\u52a0\u4e0a ES6 \u8f49\u8b6f\u898f\u5247\uff1a<\/p>\n\n<div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"presets\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"p\">[<\/span><span class=\"w\">\n      <\/span><span class=\"s2\">\"es2015\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"p\">{<\/span><span class=\"w\">\n        <\/span><span class=\"err\">\/\/<\/span><span class=\"w\"> <\/span><span class=\"err\">\u4e0d\u5c07<\/span><span class=\"w\"> <\/span><span class=\"err\">ES<\/span><span class=\"mi\">2015<\/span><span class=\"w\"> <\/span><span class=\"err\">\u6a21\u7d44\u8f49\u8b6f\u6210<\/span><span class=\"w\"> <\/span><span class=\"err\">CommonJS<\/span><span class=\"w\"> <\/span><span class=\"err\">\u6a21\u7d44<\/span><span class=\"w\">\n        <\/span><span class=\"err\">\/\/<\/span><span class=\"w\"> <\/span><span class=\"err\">\uff08webpack<\/span><span class=\"w\"> <\/span><span class=\"mi\">2<\/span><span class=\"w\"> <\/span><span class=\"err\">\u958b\u59cb\u5df2\u652f\u63f4<\/span><span class=\"w\"> <\/span><span class=\"err\">ES<\/span><span class=\"mi\">6<\/span><span class=\"w\"> <\/span><span class=\"err\">\u6a21\u7d44\uff09<\/span><span class=\"w\">\n        <\/span><span class=\"s2\">\"modules\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">false<\/span><span class=\"w\">\n      <\/span><span class=\"p\">}<\/span><span class=\"w\">\n    <\/span><span class=\"p\">]<\/span><span class=\"w\">\n  <\/span><span class=\"p\">]<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div><\/div>\n\n<h3 id=\"packagejson\">package.json<\/h3>\n<h4 id=\"\u8de8\u5e73\u53f0-node_env-\u74b0\u5883\u8b8a\u6578\">\u8de8\u5e73\u53f0 NODE_ENV \u74b0\u5883\u8b8a\u6578<\/h4>\n<p>\u70ba\u4e86\u8b93 Windows\u3001macOS\u3001Linux \u90fd\u53ef\u4ee5\u6b63\u78ba\u8a2d\u5b9a Node.js \u7684 NODE_ENV \u74b0\u5883\u8b8a\u6578\uff0c\u6211\u5011\u4f7f\u7528 <a href=\"https:\/\/www.npmjs.com\/package\/cross-env\">cross-env<\/a> \u4f86\u7d71\u4e00\u89e3\u6c7a\u3002<\/p>\n\n<p>\u5c07 cross-env \u5b89\u88dd\u70ba\u5c08\u6848\u958b\u767c\u74b0\u5883\u76f8\u4f9d\u5957\u4ef6\uff1a<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>npm install cross-env <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h4 id=\"npm-scripts\">npm-scripts<\/h4>\n<p>\u8a2d\u5b9a package.json \u4e2d\u7684 <code class=\"highlighter-rouge\">scripts<\/code> \u5c6c\u6027\uff08\u82e5\u672a\u6709\u6b64\u5c6c\u6027\u53ef\u81ea\u884c\u65b0\u589e\uff09\u503c\u70ba\uff1a<\/p>\n\n<div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"dev\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"webpack-dev-server --progress\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"build\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"cross-env NODE_ENV=production webpack --progress\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div><\/div>\n\n<p>\u65b9\u4fbf\u6211\u5011\u4f7f\u7528 <code class=\"highlighter-rouge\">npm run dev<\/code>\u3001<code class=\"highlighter-rouge\">npm run build<\/code> \u4f86\u57f7\u884c\u81ea\u8a02\u7684\u6307\u4ee4\uff1a<\/p>\n<ul>\n  <li><code class=\"highlighter-rouge\">npm run dev<\/code> \u555f\u52d5 webpack Dev Server<\/li>\n  <li><code class=\"highlighter-rouge\">npm run build<\/code> \u4f7f\u7528 webpack \u9032\u884c\u7de8\u8b6f\u6253\u5305<\/li>\n<\/ul>\n\n<p>\u900f\u904e <code class=\"highlighter-rouge\">npm run<\/code> \u5be6\u969b\u547c\u53eb\u7684\u662f\u5b89\u88dd\u5728\u5c08\u6848\u4e2d\u7684 webpack\u3001webpack Dev Server\uff0c\u800c\u4e0d\u662f\u5168\u57df\u4e2d\u7684\u5957\u4ef6\u3002<\/p>\n\n<h3 id=\"gitignore\">.gitignore<\/h3>\n<p>\u5c08\u6848\u76f8\u4f9d\u5957\u4ef6\u7684\u5b89\u88dd\u76ee\u9304\uff08node_modules\uff09\u4ee5\u53ca\u958b\u767c\u6642\u6240\u7522\u751f\u7684\u6a94\u6848\uff0c\u80fd\u5728 .gitignore \u4e2d\u8a2d\u5b9a\u8b93 Git \u6392\u9664\uff0c\u53ef\u4ee5\u76f4\u63a5\u81f3 <a href=\"https:\/\/www.gitignore.io\/\">gitignore.io<\/a> \u53d6\u5f97\u88fd\u4f5c\u597d\u7684<a href=\"https:\/\/www.gitignore.io\/api\/node\">\u8a2d\u5b9a\u6a94<\/a>\u3002<\/p>\n\n<h2 id=\"\u5b8c\u6574\u5c08\u6848\u7d50\u69cb\">\u5b8c\u6574\u5c08\u6848\u7d50\u69cb<\/h2>\n<p>\u5b8c\u6210\u6240\u6709\u8a2d\u5b9a\u4e4b\u5f8c\uff0c\u4fbf\u53ef\u4ee5\u5c07 HTML\u3001CSS \u7f6e\u65bc src \u4e2d\uff0c\u4e26\u5728 src\/js \u958b\u59cb\u64b0\u5beb ES6 \u7a0b\u5f0f\u3002<\/p>\n\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>project\n\u251c\u2500\u2500 (dist)\n\u2502    \u251c\u2500\u2500 css\n\u2502    \u251c\u2500\u2500 js\n\u2502    \u2502    \u2514\u2500\u2500 bundle.js\n\u2502    \u2514\u2500\u2500 index.html\n\u251c\u2500\u2500 src\n\u2502    \u251c\u2500\u2500 css\n\u2502    \u251c\u2500\u2500 js\n\u2502    \u2502    \u2514\u2500\u2500 index.js\n\u2502    \u2514\u2500\u2500 index.html\n\u251c\u2500\u2500 node_modules\n\u251c\u2500\u2500 .babelrc\n\u251c\u2500\u2500 .gitignore\n\u251c\u2500\u2500 package-lock.json\n\u251c\u2500\u2500 package.json\n\u2514\u2500\u2500 webpack.config.js\n<\/code><\/pre><\/div><\/div>\n\n<p>\u203bdist \u70ba\u8f38\u51fa\u76ee\u9304\uff0c\u5176\u4e2d\u7684 bundle.js \u70ba\u8f49\u8b6f\u5f8c\u7522\u51fa\u7684\u6a94\u6848<\/p>\n\n<h3 id=\"\u958b\u555f-hot-reload-\u652f\u63f4\">\u958b\u555f Hot-Reload \u652f\u63f4<\/h3>\n<p>\u9664\u4e86 webpack.config.js \u4e2d\u7684\u8a2d\u5b9a\uff0cindex.js \u4e5f\u5fc5\u9808\u52a0\u4e0a HMR \u7684 API \u547c\u53eb\uff1a<\/p>\n\n<div class=\"language-javascript highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">hot<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">hot<\/span><span class=\"p\">.<\/span><span class=\"nx\">accept<\/span><span class=\"p\">(<\/span><span class=\"s1\">'.\/es6module'<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ \u8a2d\u5b9a\u7576\u6307\u5b9a\u7684\u6a21\u7d44\uff08\u7bc4\u4f8b\u70ba es6module.js\uff09\u5728 HMR \u5b8c\u6210\u5f8c\u8981\u57f7\u884c\u7684\u4e8b\u60c5<\/span>\n    <span class=\"c1\">\/\/ \u901a\u5e38\u70ba\u91cd\u65b0\u8b80\u53d6\u9019\u500b\u6a21\u7d44\u4e26\u66f4\u65b0\u7db2\u9801\u756b\u9762<\/span>\n  <span class=\"p\">})<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\u8b93 HMR \u5075\u6e2c index.js \u6240\u76f8\u4f9d\u7684\u6a21\u7d44\u6709\u66f4\u65b0\u6a94\u6848\u5167\u5bb9\u6642\uff0c\u53ef\u4ee5\u4f9d\u6211\u5011\u7684\u8a2d\u5b9a\u9032\u884c\u8655\u7406\u3002\u82e5\u662f HMR \u672a\u88ab\u555f\u7528\uff0c\u5247\u6b64\u6bb5\u7a0b\u5f0f\u4fbf\u4e0d\u6703\u57f7\u884c\u3002<\/p>\n\n<h2 id=\"\u5b8c\u6574\u7bc4\u4f8b\u5c08\u6848\">\u5b8c\u6574\u7bc4\u4f8b\u5c08\u6848<\/h2>\n<p>\u672c\u7bc7\u5b8c\u6574\u7684\u7bc4\u4f8b\u5c08\u6848\u53ef\u4ee5\u5728 GitHub \u4e0a\u770b\u5230\uff1a<a href=\"https:\/\/github.com\/jackblackevo\/simple-es6-webpack-project\">simple-es6-webpack-project<\/a><\/p>\n\n<h2 id=\"\u984d\u5916\u53c3\u8003\">\u984d\u5916\u53c3\u8003<\/h2>\n<ul>\n  <li><a href=\"https:\/\/webpack.js.org\/concepts\/\">webpack - Concepts<\/a><\/li>\n  <li><a href=\"https:\/\/webpack.js.org\/configuration\/\">webpack - Configuration<\/a><\/li>\n  <li><a href=\"https:\/\/webpack.js.org\/guides\/migrating\/\">webpack - Migrating from v1 to v2<\/a><\/li>\n  <li><a href=\"https:\/\/webpack.js.org\/plugins\/define-plugin\/\">webpack - DefinePlugin<\/a><\/li>\n  <li><a href=\"https:\/\/webpack.js.org\/plugins\/html-webpack-plugin\/\">webpack - HtmlwebpackPlugin<\/a><\/li>\n  <li><a href=\"https:\/\/webpack.js.org\/configuration\/devtool\/\">webpack - Devtool<\/a><\/li>\n  <li><a href=\"https:\/\/webpack.js.org\/configuration\/dev-server\/\">webpack - DevServer<\/a><\/li>\n  <li><a href=\"https:\/\/webpack.js.org\/concepts\/hot-module-replacement\/\">webpack - Concepts: Hot Module Replacement<\/a><\/li>\n  <li><a href=\"https:\/\/webpack.js.org\/guides\/hot-module-replacement\/\">webpack  - Guides: Hot Module Replacement<\/a><\/li>\n  <li><a href=\"https:\/\/github.com\/webpack\/docs\/wiki\/hot-module-replacement-with-webpack\">webpack - hot module replacement with webpack<\/a><\/li>\n  <li><a href=\"https:\/\/nodejs.org\/api\/path.html#path_path_join_paths\">Node.js Documentation - path.join([\u2026paths])<\/a><\/li>\n  <li><a href=\"https:\/\/nodejs.org\/docs\/latest\/api\/globals.html#globals_dirname\">Node.js Documentation - __dirname<\/a><\/li>\n  <li><a href=\"http:\/\/eddychang.me\/blog\/javascript\/76-source-map.html\">eddychang.me - Source Map(\u539f\u59cb\u78bc\u6620\u5c04\u8868)<\/a><\/li>\n  <li><a href=\"http:\/\/blog.npmjs.org\/post\/161081169345\/v500\">The npm Blog - v5.0.0<\/a><\/li>\n  <li><a href=\"https:\/\/mp.weixin.qq.com\/s?__biz=MjM5MDcyMzIwNQ==&amp;mid=2447503211&amp;idx=1&amp;sn=ace8556f50d9e024ac961a35a81a6ed7&amp;chksm=b25532818522bb9763fd079aec1aec45e5797174dde6f4a082eed21aed34504be3f69138600d#rd\">\u8001\u96f7\u7684\u5b9e\u9a8c\u5ba4 - \u8bf4\u8bf4 npm 5 \u7684\u65b0\u5751<\/a><\/li>\n  <li><a href=\"https:\/\/docs.npmjs.com\/files\/package-locks\">npm - npm-package-locks<\/a><\/li>\n  <li><a href=\"https:\/\/jackblackevo.github.io\/npm-vs-yarn-cli-commands-comparison\/\">npm vs. Yarn\uff1a\u6307\u4ee4\u5c0d\u7167<\/a><\/li>\n<\/ul>\n","pubDate":"Fri, 24 Feb 2017 00:00:00 +0000"},{"title":"JavaScript \u4e8b\u4ef6\u6d41","link":"\/2016\/12\/03\/javascript-event-flow.html","guid":"\/2016\/12\/03\/javascript-event-flow.html","description":"<p>JavaScript \u662f\u4ee5\u4e8b\u4ef6\u9a45\u52d5\u7684\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u56e0\u6b64 Event Flow \u5c31\u6210\u70ba\u4e86 JS \u5fc5\u5099\u7684\u91cd\u8981\u89c0\u5ff5\u3002<\/p>\n\n<h2 id=\"\u4e8b\u4ef6\u8655\u7406\u6a21\u578b\">\u4e8b\u4ef6\u8655\u7406\u6a21\u578b<\/h2>\n\n<h3 id=\"dom-level-0-event\">DOM Level 0 Event<\/h3>\n<p>\u5206\u70ba Inline model \u4ee5\u53ca Traditional model \u5169\u7a2e\u8655\u7406\u6a21\u578b\u3002<\/p>\n\n<h4 id=\"inline-model\">Inline model<\/h4>\n<p>\u4ee5 HTML DOM \u5143\u7d20\u7684\u5c6c\u6027\uff08attribute\uff09\u4f86\u8a3b\u518a\u4e8b\u4ef6\u8655\u7406\u51fd\u5f0f\uff0c\u4e8b\u4ef6\u8655\u7406\u51fd\u5f0f\u7684 <code class=\"highlighter-rouge\">this<\/code> \u70ba <code class=\"highlighter-rouge\">window<\/code>\u3002<\/p>\n\n<h4 id=\"traditional-model\">Traditional model<\/h4>\n<p>\u4f7f\u7528 <code class=\"highlighter-rouge\">HTMLElement.onevent<\/code> \u578b\u5f0f\u7684\u5c6c\u6027\uff08Property\uff09\u8a3b\u518a\u4e8b\u4ef6\u8655\u7406\u51fd\u5f0f\uff0c\u4e8b\u4ef6\u8655\u7406\u51fd\u5f0f\u7684 <code class=\"highlighter-rouge\">this<\/code> \u70ba\u89f8\u767c\u4e8b\u4ef6\u4e4b\u5143\u7d20\u3002<\/p>\n\n<h3 id=\"dom-level-2-event\">DOM Level 2 Event<\/h3>\n<p><code class=\"highlighter-rouge\">EventTarget.addEventListener('event', callback)<\/code> \u80fd\u8a3b\u518a\u591a\u500b\u4e8b\u4ef6\u8655\u7406\u51fd\u5f0f\u3002<\/p>\n\n<h2 id=\"\u4e8b\u4ef6\u6d41\">\u4e8b\u4ef6\u6d41<\/h2>\n<p>\u7576\u4f7f\u7528\u8005\u65bc EventTarget \u7269\u4ef6\u6240\u5728\u7684\u5143\u7d20\u4e0a\u89f8\u767c\u4e8b\u4ef6\u6642\uff0c\u700f\u89bd\u5668\u6703\u7522\u751f\u8a18\u9304\u4e8b\u4ef6\u8cc7\u8a0a\u7684\u4e8b\u4ef6\u7269\u4ef6\u3002\u5148\u81ea\u6700\u4e0a\u5c64\u7684\u5143\u7d20\u7bc0\u9ede\u958b\u59cb\uff0c\u5c07\u4e8b\u4ef6\u7269\u4ef6\u4f9d\u5e8f\u50b3\u905e\u7d66\u81f3\u76ee\u6a19\u7bc0\u9ede\uff08\u89f8\u767c\u6b64\u4e8b\u4ef6\u7684\u5143\u7d20\u7bc0\u9ede\uff09\u904e\u7a0b\u4e2d\u7d93\u904e\u7684\u6bcf\u4e00\u500b\u7bc0\u9ede\uff0c\u518d\u7531\u76ee\u6a19\u7bc0\u9ede\u5411\u4e0a\u4f9d\u5e8f\u50b3\u905e\u7d66\u81f3\u6700\u4e0a\u5c64\u7bc0\u9ede\u4e2d\u9593\u7684\u6240\u6709\u7bc0\u9ede\u3002<\/p>\n\n<ol>\n  <li>\u700f\u89bd\u5668\u5075\u6e2c\u5230\u4e8b\u4ef6\u767c\u751f\uff0c\u7522\u751f\u8a18\u9304\u4e8b\u4ef6\u8cc7\u8a0a\u7684\u4e8b\u4ef6\u7269\u4ef6\uff08\u6703\u4f7f\u7528\u76f8\u95dc\u7684\u4e8b\u4ef6\u4ecb\u9762\u4f86\u5efa\u7acb\uff09\u3002<\/li>\n  <li>\u700f\u89bd\u5668\u6703\u5f9e\u6700\u4e0a\u5c64\u7684\u5143\u7d20\u7bc0\u9ede\u958b\u59cb\uff0c\u5c07\u4e8b\u4ef6\u7269\u4ef6\u4f9d\u5e8f\u50b3\u905e\u7d66\u81f3\u76ee\u6a19\u7bc0\u9ede\uff08\u89f8\u767c\u6b64\u4e8b\u4ef6\u7684\u7bc0\u9ede\uff09\u904e\u7a0b\u4e2d\u7d93\u904e\u7684\u6bcf\u4e00\u500b\u7bc0\u9ede\uff0c\u6b64\u904e\u7a0b\u70ba\u6355\u6349\u968e\u6bb5\uff08Capture Phase\uff09\uff0c\u700f\u89bd\u5668\u6703\u4f9d\u5e8f\u547c\u53eb\u50b3\u905e\u904e\u7a0b\u6bcf\u500b\u7bc0\u9ede\u4e2d\u8a3b\u518a\u7684\u6355\u6349\u968e\u6bb5\u4e8b\u4ef6\u76e3\u807d\u5668\u3002<\/li>\n  <li>\u81ea\u4e0a\u5c64\u50b3\u905e\u5230\u76ee\u6a19\u7bc0\u9ede\uff08\u89f8\u767c\u6b64\u4e8b\u4ef6\u7684\u7bc0\u9ede\uff09\u6642\uff0c\u70ba\u547d\u4e2d\u968e\u6bb5\uff08Target Phase\uff09\uff0c\u700f\u89bd\u5668\u6703\u4f9d\u76ee\u6a19\u7bc0\u9ede\u4e2d\u7684\u8a3b\u518a\u9806\u5e8f\u4f86\u547c\u53eb\u4e8b\u4ef6\u76e3\u807d\u5668\u3002<\/li>\n  <li>\u7531\u76ee\u6a19\u7bc0\u9ede\u5411\u4e0a\u4f9d\u5e8f\u50b3\u905e\u7d66\u81f3\u6700\u4e0a\u5c64\u7bc0\u9ede\u4e2d\u9593\u7684\u6240\u6709\u7bc0\u9ede\uff0c\u6b64\u904e\u7a0b\u70ba\u5192\u6ce1\u968e\u6bb5\uff08Bubbling Phase\uff09\uff0c\u700f\u89bd\u5668\u6703\u4f9d\u5e8f\u547c\u53eb\u50b3\u905e\u904e\u7a0b\u6bcf\u500b\u7bc0\u9ede\u4e2d\u8a3b\u518a\u7684\u5192\u6ce1\u968e\u6bb5\u4e8b\u4ef6\u76e3\u807d\u5668\u3002<\/li>\n<\/ol>\n\n<p><img src=\"https:\/\/www.w3.org\/TR\/DOM-Level-3-Events\/images\/eventflow.svg\" alt=\"W3C - Graphical representation of an event dispatched in a DOM tree using the DOM event flow\" \/><\/p>\n\n<h2 id=\"\u4e8b\u4ef6\u7269\u4ef6\u8207\u4e8b\u4ef6\u5c0d\u8c61\">\u4e8b\u4ef6\u7269\u4ef6\u8207\u4e8b\u4ef6\u5c0d\u8c61<\/h2>\n\n<h3 id=\"event\">Event<\/h3>\n\n<h4 id=\"currenttarget\">currentTarget<\/h4>\n<p>\u7e3d\u6703\u6307\u5411\u73fe\u5728\u6b63\u8655\u7406\u8a72\u4e8b\u4ef6\u7684\u4e8b\u4ef6\u76e3\u807d\u5668\u6240\u8a3b\u518a\u7684 DOM \u7269\u4ef6\u3002<\/p>\n\n<h4 id=\"target\">target<\/h4>\n<p>\u6c38\u9060\u6307\u5411\u89f8\u767c\u4e8b\u4ef6\u7684 DOM \u7269\u4ef6\u3002<\/p>\n\n<h4 id=\"eventphase\">eventPhase<\/h4>\n<p>\u8868\u793a\u4e8b\u4ef6\u7269\u4ef6\u76ee\u524d\u65bc\u4e8b\u4ef6\u6d41\uff08Event Flow\uff09\u4e2d\u50b3\u905e\u7684\u9032\u5ea6\u70ba\u54ea\u4e00\u500b\u968e\u6bb5\u3002<\/p>\n\n<h4 id=\"preventdefault\">preventDefault()<\/h4>\n<p>\u5982\u679c\u4e8b\u4ef6\u53ef\u4ee5\u88ab\u53d6\u6d88\uff0c\u5c31\u53d6\u6d88\u4e8b\u4ef6\uff08\u5373\u53d6\u6d88\u4e8b\u4ef6\u7684\u9810\u8a2d\u884c\u70ba\uff09\u3002\u4f46\u4e0d\u6703\u5f71\u97ff\u4e8b\u4ef6\u7684\u50b3\u905e\uff0c\u4e8b\u4ef6\u4ecd\u6703\u7e7c\u7e8c\u50b3\u905e\u3002<\/p>\n\n<p><strong>\u7279\u5225\u6ce8\u610f\uff1a<\/strong>\n\u700f\u89bd\u5668\u7684\u4e8b\u4ef6\u9810\u8a2d\u884c\u70ba\u662f\u5f85\u4e8b\u4ef6\u6d41\u7d50\u675f\u4e4b\u5f8c\u624d\u6703\u57f7\u884c\u904b\u4f5c\uff0c\u6240\u4ee5\u5b50\u5143\u7d20\u7684\u4e8b\u4ef6\u5728\u6355\u6349\u968e\u6bb5\u6216\u5192\u6ce1\u968e\u6bb5\u6642\u88ab\u7236\u5143\u7d20\u7684\u4e8b\u4ef6\u76e3\u807d\u5668\u5c07 <code class=\"highlighter-rouge\">Event.preventDefault()<\/code> \u7684\u8a71\uff0c\u4e5f\u6703\u56e0\u6b64\u88ab\u53d6\u6d88\u4e8b\u4ef6\u7684\u9810\u8a2d\u884c\u70ba\uff01<\/p>\n\n<h4 id=\"stoppropagation\">stopPropagation()<\/h4>\n<p>\u505c\u6b62\u4e8b\u4ef6\u7e7c\u7e8c\u50b3\u905e\u3002<\/p>\n\n<h3 id=\"eventtarget\">EventTarget<\/h3>\n\n<h4 id=\"addeventlistenerremoveeventlistener\">addEventListener()\u3001removeEventListener()<\/h4>\n<div class=\"language-javascript highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nx\">EventTarget<\/span><span class=\"p\">.<\/span><span class=\"nx\">addEventListener<\/span><span class=\"p\">(<\/span><span class=\"nx\">type<\/span><span class=\"p\">,<\/span> <span class=\"nx\">listener<\/span><span class=\"p\">[,<\/span> <span class=\"nx\">useCapture<\/span><span class=\"p\">])<\/span>\n<span class=\"nx\">EventTarget<\/span><span class=\"p\">.<\/span><span class=\"nx\">removeEventListener<\/span><span class=\"p\">(<\/span><span class=\"nx\">type<\/span><span class=\"p\">,<\/span> <span class=\"nx\">listener<\/span><span class=\"p\">[,<\/span> <span class=\"nx\">useCapture<\/span><span class=\"p\">])<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<ul>\n  <li><code class=\"highlighter-rouge\">type<\/code>\uff1a\u4e8b\u4ef6\u540d\u7a31<\/li>\n  <li><code class=\"highlighter-rouge\">listener<\/code>\uff1a\u76e3\u807d\u5668\uff0c\u4e5f\u5c31\u662f\u4e8b\u4ef6\u8655\u7406\u51fd\u5f0f<\/li>\n  <li><code class=\"highlighter-rouge\">useCapture<\/code>\uff1a\u5e03\u6797\u503c\uff0c\u9810\u8a2d\u70ba <code class=\"highlighter-rouge\">false<\/code>\uff08\u8a3b\u518a\u6216\u79fb\u9664\u5192\u6ce1\u968e\u6bb5\u7684\u4e8b\u4ef6\u76e3\u807d\u5668\uff09\uff0c<code class=\"highlighter-rouge\">true<\/code> \u5247\u70ba\u8a3b\u518a\u6216\u79fb\u9664\u6355\u6349\u968e\u6bb5\u7684\u4e8b\u4ef6\u76e3\u807d\u5668\u3002\u6b64\u53c3\u6578\u5c0d\u76ee\u6a19\u7bc0\u9ede\uff08\u4e8b\u4ef6\u5c0d\u8c61\uff09\u672c\u8eab\u7121\u6548\uff0c\u6355\u6349\u968e\u6bb5\u7684\u4e8b\u4ef6\u76e3\u807d\u5668\u5728\u76ee\u6a19\u7bc0\u9ede\u4e2d\u88ab\u8996\u70ba\u547d\u4e2d\u968e\u6bb5\u7684\u4e8b\u4ef6\u76e3\u807d\u5668\uff0c\u5373\u50c5\u4f9d\u8a3b\u518a\u9806\u5e8f\u4f86\u547c\u53eb\uff08\u76e3\u807d\u5668\u57f7\u884c\u7684\u9806\u5e8f\u6309\u7167\u8a3b\u518a\u6642\u7684\u5148\u5f8c\u6c7a\u5b9a\uff09<\/li>\n<\/ul>\n\n<p>\u5192\u6ce1\u968e\u6bb5\u548c\u6355\u6349\u968e\u6bb5\u7684\u76e3\u807d\u5668\u662f\u5404\u81ea\u7368\u7acb\u7684\u3002\u5047\u5982\u4e00\u500b\u76e3\u807d\u5668\u5206\u5225\u5728\u540c\u4e00\u500b\u7269\u4ef6\u4e0a\u8a3b\u518a\u4e86\u5192\u6ce1\u968e\u6bb5\u8207\u6355\u6349\u968e\u6bb5\uff0c\u82e5\u8981\u79fb\u9664\uff0c\u4e5f\u5fc5\u9808\u5206\u5225\u79fb\u9664\u3002<\/p>\n\n<h4 id=\"dispatchevent\">dispatchEvent()<\/h4>\n<div class=\"language-javascript highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nx\">EventTarget<\/span><span class=\"p\">.<\/span><span class=\"nx\">dispatchEvent<\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<ul>\n  <li><code class=\"highlighter-rouge\">event<\/code>\uff1a\u8981\u88ab\u89f8\u767c\u7684\u4e8b\u4ef6\u7269\u4ef6<\/li>\n<\/ul>\n\n<p>\u65bc <code class=\"highlighter-rouge\">EventTarget<\/code> \u4e0a\u89f8\u767c\u6307\u5b9a\u7684\u4e8b\u4ef6\u3002<\/p>\n","pubDate":"Sat, 03 Dec 2016 00:00:00 +0000"},{"title":"Angular 2 \u958b\u767c\u74b0\u5883","link":"\/2016\/11\/08\/angular-2-development-environment.html","guid":"\/2016\/11\/08\/angular-2-development-environment.html","description":"<p>\u521d\u5b78 <a href=\"https:\/\/angular.io\/\">Angular 2<\/a> \u7684\u7b2c\u4e00\u4ef6\u4e8b\u5c31\u662f\u5efa\u69cb\u958b\u767c\u74b0\u5883\u4e86\uff0c\u8a18\u9304\u4e00\u4e9b\u81ea\u5df1\u8e29\u5230\u7684\u96f7\u5427 \ud83d\ude1a<\/p>\n\n<h2 id=\"nodejs-\u885d\u7a81\">Node.js \u885d\u7a81<\/h2>\n<p>\u5982\u679c\u6709\u4f7f\u7528 Homebrew\uff08\u6216\u5176\u5b83\u5957\u4ef6\u7ba1\u7406\u5de5\u5177\uff09\u4ee5\u53ca Node Version Manager\uff08NVM\uff09\uff0c\u8981\u7279\u5225\u6ce8\u610f\u662f\u5426\u5728\u5169\u908a\u90fd\u88dd\u4e86 Node.js\u3002\u56e0\u70ba Homebrew \u5728\u5b89\u88dd\u5957\u4ef6\u6642\u6703\u4e00\u4f75\u5b89\u88dd\u4f9d\u8cf4\u7684\u5957\u4ef6\uff0c\u6709\u53ef\u80fd\u6703\u548c\u539f\u672c NVM \u6240\u7ba1\u7406\u7684 Node.js \u885d\u7a81\uff0c\u5c0e\u81f4\u5728\u57f7\u884c <code class=\"highlighter-rouge\">node<\/code>\u3001<code class=\"highlighter-rouge\">npm<\/code>\u3001<code class=\"highlighter-rouge\">yarn<\/code> \u6642\u641e\u6df7\u5230\u5e95\u662f\u54ea\u4e00\u908a\u7684 Node.js\u3002\u79fb\u9664 Homebrew \u64c5\u81ea\u5b89\u88dd\u7684 Node.js\uff0c\u4fdd\u7559 NVM \u7ba1\u7406\u7684\u7248\u672c\u5c31\u597d\u3002<\/p>\n\n<h2 id=\"angular-cli-\u932f\u8aa4\">angular-cli \u932f\u8aa4<\/h2>\n\n<h3 id=\"\u932f\u8aa4\u8a0a\u606f\">\u932f\u8aa4\u8a0a\u606f\uff1a<\/h3>\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>It seems like you're using a project generated using an old version of the Angular CLI.\nThe latest CLI now uses webpack and includes a lot of improvements, include a simpler\nworkflow, a faster build and smaller bundles.\n\nTo get more info, including a step-by-step guide to upgrade the CLI, follow this link:\nhttps:\/\/github.com\/angular\/angular-cli\/wiki\/Upgrading-from-Beta.10-to-Beta.14\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u767c\u751f\u539f\u56e0\">\u767c\u751f\u539f\u56e0\uff1a<\/h3>\n<p>\u5de5\u4f5c\u76ee\u9304\u88ab\u8996\u70ba\u820a\u7248 angular-cli \u6240\u7522\u751f\u7684\u5c08\u6848\uff0c\u53ef\u5c0b\u627e\u8a72\u76ee\u9304\u6216\u5176\u7236\u76ee\u9304\u4e2d\u7684 node_modules \u8cc7\u6599\u593e\uff0c\u5c07\u6b64\u8cc7\u6599\u593e\u522a\u9664\u5373\u53ef\u3002<\/p>\n\n<hr \/>\n\n<h3 id=\"\u932f\u8aa4\u8a0a\u606f-1\">\u932f\u8aa4\u8a0a\u606f\uff1a<\/h3>\n<div class=\"highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>You cannot use the new command inside an angular-cli project.\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\u767c\u751f\u539f\u56e0-1\">\u767c\u751f\u539f\u56e0\uff1a<\/h3>\n<p>\u540c\u4e0a\u4e00\u6848\u4f8b\uff0c\u53ef\u5c0b\u627e package.json \u522a\u9664\u4e4b\u3002<\/p>\n","pubDate":"Tue, 08 Nov 2016 00:00:00 +0000"}]}}