虾哔哔

虾哔哔 查看完整档案

北京编辑  |  填写毕业院校  |  填写所在公司/组织 blog.mrcxt.com 编辑
编辑

┌ ○ ┐
 │帅|ハ,,ハ
 │哥|゚ω゚ ) 
 │证 _ | //
 └ ○ ┘ (⌒)
    し⌒

个人动态

虾哔哔 赞了回答 · 2020-01-15

React比Vue.js好在哪?

都学吧,vue入门确实比react简单,要是从用户体验角度考虑,绝对是vue是最好的产品经理

关注 28 回答 18

虾哔哔 赞了回答 · 2020-01-15

React比Vue.js好在哪?

React 与其说是一种框架,倒不如说是一种开发范式。它的核心理念非常简单:

界面/视图就是数据结构的可视化表达
UI = f(data)

而界面/视图由组件组合而来
UI = f1(data) + f2(data) + f3(data) + ...

That's all.

React 扮演的角色就是上述公式中的 f,它完全是函数式的,组件就是函数,给它一个输入(传参),它就返回一个输出(UI)。只有理解了这种开发理念,用 React 才会得心应手。如果只是去学“语法”,仅满足于“能用”,React 确实会显得非常怪异而麻烦。

Vue 的核心理念与 React 其实是一致的,但在 API 的实现上 Vue 对于用户而言更加友好。不像 React,Vue 不会要求用户“Think in Vue”,因为不需要,Vue 是一个渐进式的框架,它并没有大幅改变用户原有的开发方式,它既可以作为插件植入老的 jQuery 项目,也可以作为整个项目的核心框架层。并且 Vue 提供了各种实用的 API,而 React 本身的 API 非常少,许多功能需要自行封装或引用现成的组件。

从能力上讲,两个框架其实差别不大,几乎不存在 React 能干而 Vue 干不了或 Vue 能干而 React 干不了的事,不都是 JS 嘛。不过 React 对于使用者的 JS 能力有一定要求,而 Vue 基本上跟 jQuery 一样前端入门一个月就开始学也没什么问题,以致于知乎上有人开始担心 Vue 大幅削弱了前端的门槛,降低了前端的水准。。。

在实际业务中,我个人更倾向于 Vue,理由就是简单,简单就是好。招人方便,就算不会,很快能上手,写出的代码就算渣,改起来也相对容易。滴滴、饿了么都是 Vue 的深度实践者,百度、京东也有相关实践,阿里直接与 Vue 合作搞了 weex,微信小程序的 API 几乎就是 Vue 的翻版。会用 Vue,同时就会了 weex 和小程序。做后台用
Element UI,简直找不到更好更高效的后台应用解决方案了。Vue 就是新时代的 jQuery,是广大中小型互联网公司的福音。

至于为什么有些团队选择 React,我个人猜测的原因是:首先他们有足够的实力;其次,决策者的精英主义情节让他们下意识的避免容易被认为“简单”的东西;第三,Vue 一开始是个人搞的业余项目,且比 React 晚了两年,还未得到足够的验证,而 React 出身不凡,并且在自家产品里有广泛实践。

总之,我看好 Vue。先学 Vue 再学 React,你会忍不住感慨:真是太麻烦了,太麻烦了。而先学 React,再学 Vue,你会忍不住感慨:真是太方便了,太方便了。

关注 28 回答 18

虾哔哔 收藏了文章 · 2020-01-09

更优雅地使用命令行

zsh

工欲善其事,必先利其器,通过武装自己的命令行工具,从而更优雅地使用命令行,可以使工作更加高效并且有趣。本文将以下几个方面来介绍命令行的使用技巧和提效工具

CLI 一键呼入呼出

iterm2 是一款完全免费,为 MacOS 打造的终端工具,特色功能是可以开启热键窗口,达到一键呼入呼出的效果

效果如下:

iterm2

详细设置如下:

1、首先,进行如下设置

preferences > Keys > HotKey > Create a Dedicated Hotkey Window...

iterm2_set01

2、接着,设置热键,并选择 Animate showing and hidingFloating window 这两个选项

iterm2_set02

zsh

目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash。oh my zsh 是强化版的 Shell

如果是 Mac OS,默认应该自带了 zsh 了,安装之前可以确认一下

cat /etc/shells

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

通过如下命令,可以查看当前环境的 shell

echo $SHELL

可以使用如下的命令进行 shell 切换,要特别注意的是,切换 shell 后,重启 CLI 才能生效

chsh -s /bin/bash # 切换bash
chsh -s /bin/zsh # 切换zsh

接下来,开始安装 oh-my-zsh,要特别注意的是,不能使用官网的地址进行安装,否则会提示

Failed to connect to raw.github.com port 443: Connection refused

而应该用如下的地址进行安装

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装完成后,会提示是否将 zsh 设置为默认 shell,选择 Y

Time to change your default shell to zsh:
Do you want to change your default shell to zsh? [Y/n] y
Changing the shell...
Changing shell for root.
Shell successfully changed to '/bin/zsh'.

         __                                     __
  ____  / /_     ____ ___  __  __   ____  _____/ /_
 / __ \/ __ \   / __ `__ \/ / / /  /_  / / ___/ __ \
/ /_/ / / / /  / / / / / / /_/ /    / /_(__  ) / / /
\____/_/ /_/  /_/ /_/ /_/\__, /    /___/____/_/ /_/
                        /____/                       ....is now installed!


Please look over the ~/.zshrc file to select plugins, themes, and options.

p.s. Follow us on https://twitter.com/ohmyzsh

p.p.s. Get stickers, shirts, and coffee mugs at https://shop.planetargon.com/collections/oh-my-zsh

下面简单介绍下 oh-my-zsh 的优点

1、主题提示信息从用户名和主机名变成了当前目录的名称

2、按 tab 键补全,不仅可以补全命令,也可以补全选项、参数、文件等

3、跳转路径可省略 cd 命令,并可进行路径的首字符匹配

c/k/k/t/c

按下 tab 键之后,会自动补全为如下路径

code/ktsg/ktsg_new/trunk/config

4、当前所在目录下直接输入 d ,将会展示出历史访问目录列表(最近20个),并且左侧加了数字索引

$ d
0    ~/Desktop/md/blog
1    ~/Desktop/md
2    ~/Desktop
3    ~

别名配置

使用 git 别名配置,可以让 git 体验更简单

可以通过 git config 命令来为命令 git branch 设置一个别名

$ git config --global alias.b branch

这意味着,当要输入 git branch 时,只需要输入 git b 就好了

更简单的方式,是直接编辑 ~/.gitconfig 文件,可以达到相同的效果

[alias]
b = branch

但如果只想输入 gb,就想实现 git branch 相同的效果,则需要使用 linux 的别名功能

实际上,zsh 已经默认设置了 git 的插件,文件路径如下

.oh-my-zsh/plugins/git/git.plugin.zsh

下面是一些常用的配置

alias g='git'
alias ga='git add'
alias gb='git branch'
alias gc='git commit -v'
alias gca='git commit -v -a'
alias gcam='git commit -a -m'
alias gcb='git checkout -b'
alias gcmsg='git commit -m'
alias gco='git checkout'
alias gd='git diff'
alias gl='git pull'
alias glog='git log --oneline --decorate --graph'
alias gloga='git log --oneline --decorate --graph --all'
alias gp='git push'
alias gsb='git status -sb'
alias gst='git status'

使用 gst 的效果如下

$ gst
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   html_backup.md
    new file:   t.html

homebrew

brew 又叫 homebrew,是 Mac 上的软件包管理工具,可以在 Mac 中方便的安装或者卸载软件

下面是 homebrew 的常用命令

brew install git # 安装
brew uninstall wget # 卸载
brew list # 列出已安装的软件

插件推荐

下面是一些插件推荐,插件安装完成后,需要打开 ~/.zshrc,找到 plugins=,然后在里面写需要的插件名。只要修改了此文件,要使用 source ~/.zshrc 来更新配置

快速跳转

autojump 插件实现了目录间快速跳转,想去哪个目录直接 j + 目录名,不用再频繁的 cd

使用 autojump 命令,或使用短命令 j 来跳转到指定目录。要注意的是,只有打开过的目录插件才会记录。所以,使用时间越长,插件才越智能

j directoryName

zsh_02

安装如下:

brew install autojump

然后在 .zshrc 文件中添加如下语句

[[ -s `brew --prefix`/etc/autojump.sh ]] && . `brew --prefix`/etc/autojump.sh

命令提示

使用 zsh-autosuggestions 插件可以在输入命令时提示自动补全(灰色部分),然后按键盘方向右键,即可补全

zsh_01

安装如下:

cd ~/.oh-my-zsh/custom/plugins/
sudo git clone https://github.com/zsh-users/zsh-autosuggestions

语法高亮

使用 zsh-syntax-highlighting 插件,日常用的命令会高亮显示,命令错误显示红色

zsh_03

安装如下:

cd ~/.oh-my-zsh/custom/plugins/
sudo git clone https://github.com/zsh-users/zsh-syntax-highlighting.git

命令更正

使用 thefuck 插件,可以用于命令纠正,输入 fuck 后,可以纠正前一条输错的命令

the_fuck

安装如下:

brew install thefuck

然后在 .zshrc 文件中添加如下语句

eval $(thefuck --alias)

搜索关键词

使用 web-search 插件可以使用搜索引擎进行搜索,比如使用 googlestackoverflow

$ google oh-my-zsh # 使用 google 搜索 oh-my-zsh
$ stackoverflow oh-my-zsh # 使用 stackoverflow 搜索 oh-my-zsh

zsh_web_search

该插件不需要安装,直接在 zshrc 文件中的 plugins 中添加即可

打开远程仓库

使用 git-open 插件,输入 git open 就能够在浏览器中打开一个仓库的 github 页面

git_open

安装如下:

cd ~/.oh-my-zsh/custom/plugins/
sudo git clone https://github.com/paulirish/git-open.git $ZSH_CUSTOM/plugins/git-open

快捷搜索

fzf 插件是一个通用的命令行模糊搜索工具,依靠模糊的关键词,可以快速定位文件

通过 code $(fzf) 命令可以进行文件搜索

fzf

安装如下:

brew install fzf

翻译

translate shell 是一款默认借助谷歌翻译来进行翻译的命令行翻译器

使用 trans 命令可以进行翻译,加上 -sp选项(speak的简写)同时也可以发音

trans

安装如下:

brew install translate-shell

插件配置

上面的插件安装完成后,.zshrc 文件的插件部分的相关配置如下

plugins=(
    git
    web-search
    autojump
    zsh-syntax-highlighting
    zsh-autosuggestions
    git-open
    fzf
)

# autojump
[[ -s `brew --prefix`/etc/autojump.sh ]] && . `brew --prefix`/etc/autojump.sh

# thefuck
eval $(thefuck --alias)
查看原文

虾哔哔 赞了文章 · 2020-01-09

更优雅地使用命令行

zsh

工欲善其事,必先利其器,通过武装自己的命令行工具,从而更优雅地使用命令行,可以使工作更加高效并且有趣。本文将以下几个方面来介绍命令行的使用技巧和提效工具

CLI 一键呼入呼出

iterm2 是一款完全免费,为 MacOS 打造的终端工具,特色功能是可以开启热键窗口,达到一键呼入呼出的效果

效果如下:

iterm2

详细设置如下:

1、首先,进行如下设置

preferences > Keys > HotKey > Create a Dedicated Hotkey Window...

iterm2_set01

2、接着,设置热键,并选择 Animate showing and hidingFloating window 这两个选项

iterm2_set02

zsh

目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash。oh my zsh 是强化版的 Shell

如果是 Mac OS,默认应该自带了 zsh 了,安装之前可以确认一下

cat /etc/shells

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

通过如下命令,可以查看当前环境的 shell

echo $SHELL

可以使用如下的命令进行 shell 切换,要特别注意的是,切换 shell 后,重启 CLI 才能生效

chsh -s /bin/bash # 切换bash
chsh -s /bin/zsh # 切换zsh

接下来,开始安装 oh-my-zsh,要特别注意的是,不能使用官网的地址进行安装,否则会提示

Failed to connect to raw.github.com port 443: Connection refused

而应该用如下的地址进行安装

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装完成后,会提示是否将 zsh 设置为默认 shell,选择 Y

Time to change your default shell to zsh:
Do you want to change your default shell to zsh? [Y/n] y
Changing the shell...
Changing shell for root.
Shell successfully changed to '/bin/zsh'.

         __                                     __
  ____  / /_     ____ ___  __  __   ____  _____/ /_
 / __ \/ __ \   / __ `__ \/ / / /  /_  / / ___/ __ \
/ /_/ / / / /  / / / / / / /_/ /    / /_(__  ) / / /
\____/_/ /_/  /_/ /_/ /_/\__, /    /___/____/_/ /_/
                        /____/                       ....is now installed!


Please look over the ~/.zshrc file to select plugins, themes, and options.

p.s. Follow us on https://twitter.com/ohmyzsh

p.p.s. Get stickers, shirts, and coffee mugs at https://shop.planetargon.com/collections/oh-my-zsh

下面简单介绍下 oh-my-zsh 的优点

1、主题提示信息从用户名和主机名变成了当前目录的名称

2、按 tab 键补全,不仅可以补全命令,也可以补全选项、参数、文件等

3、跳转路径可省略 cd 命令,并可进行路径的首字符匹配

c/k/k/t/c

按下 tab 键之后,会自动补全为如下路径

code/ktsg/ktsg_new/trunk/config

4、当前所在目录下直接输入 d ,将会展示出历史访问目录列表(最近20个),并且左侧加了数字索引

$ d
0    ~/Desktop/md/blog
1    ~/Desktop/md
2    ~/Desktop
3    ~

别名配置

使用 git 别名配置,可以让 git 体验更简单

可以通过 git config 命令来为命令 git branch 设置一个别名

$ git config --global alias.b branch

这意味着,当要输入 git branch 时,只需要输入 git b 就好了

更简单的方式,是直接编辑 ~/.gitconfig 文件,可以达到相同的效果

[alias]
b = branch

但如果只想输入 gb,就想实现 git branch 相同的效果,则需要使用 linux 的别名功能

实际上,zsh 已经默认设置了 git 的插件,文件路径如下

.oh-my-zsh/plugins/git/git.plugin.zsh

下面是一些常用的配置

alias g='git'
alias ga='git add'
alias gb='git branch'
alias gc='git commit -v'
alias gca='git commit -v -a'
alias gcam='git commit -a -m'
alias gcb='git checkout -b'
alias gcmsg='git commit -m'
alias gco='git checkout'
alias gd='git diff'
alias gl='git pull'
alias glog='git log --oneline --decorate --graph'
alias gloga='git log --oneline --decorate --graph --all'
alias gp='git push'
alias gsb='git status -sb'
alias gst='git status'

使用 gst 的效果如下

$ gst
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   html_backup.md
    new file:   t.html

homebrew

brew 又叫 homebrew,是 Mac 上的软件包管理工具,可以在 Mac 中方便的安装或者卸载软件

下面是 homebrew 的常用命令

brew install git # 安装
brew uninstall wget # 卸载
brew list # 列出已安装的软件

插件推荐

下面是一些插件推荐,插件安装完成后,需要打开 ~/.zshrc,找到 plugins=,然后在里面写需要的插件名。只要修改了此文件,要使用 source ~/.zshrc 来更新配置

快速跳转

autojump 插件实现了目录间快速跳转,想去哪个目录直接 j + 目录名,不用再频繁的 cd

使用 autojump 命令,或使用短命令 j 来跳转到指定目录。要注意的是,只有打开过的目录插件才会记录。所以,使用时间越长,插件才越智能

j directoryName

zsh_02

安装如下:

brew install autojump

然后在 .zshrc 文件中添加如下语句

[[ -s `brew --prefix`/etc/autojump.sh ]] && . `brew --prefix`/etc/autojump.sh

命令提示

使用 zsh-autosuggestions 插件可以在输入命令时提示自动补全(灰色部分),然后按键盘方向右键,即可补全

zsh_01

安装如下:

cd ~/.oh-my-zsh/custom/plugins/
sudo git clone https://github.com/zsh-users/zsh-autosuggestions

语法高亮

使用 zsh-syntax-highlighting 插件,日常用的命令会高亮显示,命令错误显示红色

zsh_03

安装如下:

cd ~/.oh-my-zsh/custom/plugins/
sudo git clone https://github.com/zsh-users/zsh-syntax-highlighting.git

命令更正

使用 thefuck 插件,可以用于命令纠正,输入 fuck 后,可以纠正前一条输错的命令

the_fuck

安装如下:

brew install thefuck

然后在 .zshrc 文件中添加如下语句

eval $(thefuck --alias)

搜索关键词

使用 web-search 插件可以使用搜索引擎进行搜索,比如使用 googlestackoverflow

$ google oh-my-zsh # 使用 google 搜索 oh-my-zsh
$ stackoverflow oh-my-zsh # 使用 stackoverflow 搜索 oh-my-zsh

zsh_web_search

该插件不需要安装,直接在 zshrc 文件中的 plugins 中添加即可

打开远程仓库

使用 git-open 插件,输入 git open 就能够在浏览器中打开一个仓库的 github 页面

git_open

安装如下:

cd ~/.oh-my-zsh/custom/plugins/
sudo git clone https://github.com/paulirish/git-open.git $ZSH_CUSTOM/plugins/git-open

快捷搜索

fzf 插件是一个通用的命令行模糊搜索工具,依靠模糊的关键词,可以快速定位文件

通过 code $(fzf) 命令可以进行文件搜索

fzf

安装如下:

brew install fzf

翻译

translate shell 是一款默认借助谷歌翻译来进行翻译的命令行翻译器

使用 trans 命令可以进行翻译,加上 -sp选项(speak的简写)同时也可以发音

trans

安装如下:

brew install translate-shell

插件配置

上面的插件安装完成后,.zshrc 文件的插件部分的相关配置如下

plugins=(
    git
    web-search
    autojump
    zsh-syntax-highlighting
    zsh-autosuggestions
    git-open
    fzf
)

# autojump
[[ -s `brew --prefix`/etc/autojump.sh ]] && . `brew --prefix`/etc/autojump.sh

# thefuck
eval $(thefuck --alias)
查看原文

赞 1 收藏 1 评论 0

虾哔哔 赞了回答 · 2020-01-08

vue2.6中,为什么这段代码会被执行两次

不要这样操作!!!
不要这样操作!!!
不要这样操作!!!
重要的事情说三遍
不要在渲染中修改,可能会触发无限渲染
渲染数据 -> test -> 修改数据 -> 渲染 -> test -> 因为tag此时是2所以tag = 2不会触发渲染
你把 test 函数换成 this.tag++ 就触发无限渲染了

就跟在监听自身的回调里又修改自身一个道理

如果去掉 test 里的 this.tag;
render -> test -> this.tag = 2 -> 结束,因为tag没有用到(get)所以修改tag不会触发观察者回调

加上 this.tag
render -> test -> this.tag(加入观察者) -> this.tag = 2(触发观察者回调) -> render -> this.tag(已经有依赖) -> this.tag = 2(未修改) -> 结束

关注 4 回答 2

虾哔哔 赞了回答 · 2020-01-08

vue2.6中,为什么这段代码会被执行两次

访问了tag又修改了tag,引发vue重渲,试下去除this.tag;就没有了
豆芽图片20200108143622.png
豆芽图片20200108143645.png
看vue中的依赖收集可知【第一张图是仅修改数据的依赖情况,第二张图是访问并修改】,如果你在方法里访问该属性,又修改该属性,那么就会触发重渲,vue认为你的方法对此数据有依赖。所以,如果你没有访问该数据-tag,或者访问其他数据,那么你修改tag就不会有两次输出。因为没有对修改的数据有依赖,但是非常不建议在模板中使用的函数内对数据进行修改。

关注 4 回答 2

虾哔哔 提出了问题 · 2020-01-08

vue2.6中,为什么这段代码会被执行两次

image.png

image.png

关注 4 回答 2

虾哔哔 赞了回答 · 2020-01-03

解决怎么用js通过文件的url下载文件到本地

可以使用window.open,

window.open(url)

也可以创建a标签配合download属性x形如

<a href="xxx/xxx/xx.xx" download="filename">

也可以使用iframe

function download(url){
    var iframe = document.createElement("iframe")
    iframe.style.display = "none";
    iframe.src = url;
    document.body.appendChild(iframe);
}

关注 16 回答 13

虾哔哔 赞了回答 · 2019-12-30

解决Could not find one or more icon(s)

下文中粗体部分是修改后的,亲测可用,faUser改为fas其他引用方式均未改变。
import {fas} from '@fortawesome/free-solid-svg-icons'
library.add(fas, far, fab)

完整引用

import {library} from '@fortawesome/fontawesome-svg-core'

import {fas} from '@fortawesome/free-solid-svg-icons'

import {far} from '@fortawesome/free-regular-svg-icons'
import {fab} from '@fortawesome/free-brands-svg-icons'
import {FontAwesomeIcon, FontAwesomeLayers, FontAwesomeLayersText}
  from '@fortawesome/vue-fontawesome'

library.add(fas, far, fab)
Vue.component('font-awesome-icon', FontAwesomeIcon)
Vue.component('font-awesome-layers', FontAwesomeLayers)
Vue.component('font-awesome-layers-text', FontAwesomeLayersText)

关注 1 回答 1

虾哔哔 赞了文章 · 2019-11-29

Node.js使用Nodemailer发送邮件

原文链接:Node.js使用Nodemailer发送邮件

电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。

在很多项目中,我们都会遇到邮件注册,邮件反馈等需求。在node中收发电子邮件也非常简单,因为强大的社区有各种各样的包可以供我么直接使用。Nodemailer包就可以帮助我们快速实现发送邮件的功能。

Github源码:https://github.com/ogilhinn/node-abc/tree/master/lesson10

Nodemailer简介

Nodemailer是一个简单易用的Node.js邮件发送组件

官网地址:https://nodemailer.com

GitHub地址:https://github.com/nodemailer/nodemailer

Nodemailer的主要特点包括:

  • 支持Unicode编码
  • 支持Window系统环境
  • 支持HTML内容和普通文本内容
  • 支持附件(传送大附件)
  • 支持HTML内容中嵌入图片
  • 支持SSL/STARTTLS安全的邮件发送
  • 支持内置的transport方法和其他插件实现的transport方法
  • 支持自定义插件处理消息
  • 支持XOAUTH2登录验证

安装使用

首先,我们肯定是要下载安装 注意:Node.js v6+

npm install nodemailer --save

打开官网可以看见一个小例子

'use strict';
const nodemailer = require('nodemailer');

// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
nodemailer.createTestAccount((err, account) => {

    // create reusable transporter object using the default SMTP transport
    let transporter = nodemailer.createTransport({
        host: 'smtp.ethereal.email',
        port: 587,
        secure: false, // true for 465, false for other ports
        auth: {
            user: account.user, // generated ethereal user
            pass: account.pass  // generated ethereal password
        }
    });

    // setup email data with unicode symbols
    let mailOptions = {
        from: '"Fred Foo ?" <foo@blurdybloop.com>', // sender address
        to: 'bar@blurdybloop.com, baz@blurdybloop.com', // list of receivers
        subject: 'Hello ✔', // Subject line
        text: 'Hello world?', // plain text body
        html: '<b>Hello world?</b>' // html body
    };

    // send mail with defined transport object
    transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
            return console.log(error);
        }
        console.log('Message sent: %s', info.messageId);
        // Preview only available when sending through an Ethereal account
        console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));

        // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@blurdybloop.com>
        // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
    });
});

这个小例子是生成了Ethereal的账户进行邮件发送演示的。但是这多没意思,我们来使用自己的邮箱来发送邮件

发出个真实的邮件

这里我使用了我的qq邮箱给163邮箱发送email。

'use strict';

const nodemailer = require('nodemailer');

let transporter = nodemailer.createTransport({
  // host: 'smtp.ethereal.email',
  service: 'qq', // 使用了内置传输发送邮件 查看支持列表:https://nodemailer.com/smtp/well-known/
  port: 465, // SMTP 端口
  secureConnection: true, // 使用了 SSL
  auth: {
    user: 'xxxxxx@qq.com',
    // 这里密码不是qq密码,是你设置的smtp授权码
    pass: 'xxxxxx',
  }
});

let mailOptions = {
  from: '"JavaScript之禅" <xxxxx@qq.com>', // sender address
  to: 'xxxxxxxx@163.com', // list of receivers
  subject: 'Hello', // Subject line
  // 发送text或者html格式
  // text: 'Hello world?', // plain text body
  html: '<b>Hello world?</b>' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    return console.log(error);
  }
  console.log('Message sent: %s', info.messageId);
  // Message sent: <04ec7731-cc68-1ef6-303c-61b0f796b78f@qq.com>
});

运行程序,成功将返回messageId。这是便可以去收件箱查看这个新邮件啦

email

这里我们需要注意,auth.pass 不是邮箱账户的密码而是stmp的授权码。

到此我们就掌握了发邮件的基本操作。

更多配置

  • CC: Carbon Copy(抄送),用于通知相关的人,收件人可以看到都邮件都抄送给谁了。一般回报工作或跨部门沟通时,都会CC给收件人的领导一份
  • BCC:Blind Carbon Copy(暗抄送),也是用于通知相关的人,但是收件人是看不到邮件被密送给谁了。
  • attachments: 附件

更多配置项:https://nodemailer.com/message/

这里我们就不演示CC、BCC了,请自行尝试。我们来试试发送附件

...
// 只需添加attachments配置项即可
attachments: [
    {   // utf-8 string as an attachment
      filename: 'text.txt',
      content: 'hello world!'
    },
    {
      filename: 'ZenQcode.png',
      path: path.resolve(__dirname, 'ZenQcode.png'),
    }
  ]
...

发送email,就可以收到一个内容为hello world的text.txt文件,以及一个我公众号的二维码。

好看的HTML邮件

HTML Email 编写指南: http://www.ruanyifeng.com/blog/2013/06/html_email.html

这儿,我们使用Foundation for Emails: https://foundation.zurb.com/emails.html的模板

'use strict';

const nodemailer = require('nodemailer');
const ejs = require('ejs');
const fs  = require('fs');
const path = require('path');

let transporter = nodemailer.createTransport({
  // host: 'smtp.ethereal.email',
  service: 'qq', // 使用内置传输发送邮件 查看支持列表:https://nodemailer.com/smtp/well-known/
  port: 465, // SMTP 端口
  secureConnection: true, // 使用 SSL
  auth: {
    user: 'xxxxxx@qq.com',
    // 这里密码不是qq密码,是你设置的smtp授权码
    pass: 'xxxxxx',
  }
});

let mailOptions = {
  from: '"JavaScript之禅" <xxxxx@qq.com>', // sender address
  to: 'xxxxxxxx@163.com', // list of receivers
  subject: 'Hello', // Subject line
  // 发送text或者html格式
  // text: 'Hello world?', // plain text body
  html: fs.createReadStream(path.resolve(__dirname, 'email.html')) // 流
};

// send mail with defined transport object
transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    return console.log(error);
  }
  console.log('Message sent: %s', info.messageId);
  // Message sent: <04ec7731-cc68-1ef6-303c-61b0f796b78f@qq.com>
});

运行程序,你将如愿以偿收到如下Email。样式可能会有细微偏差

屏幕快照 2017-12-01 16.32.41

上面email中我们用了外链的图片,我们也可以使用附件的方式,将图片嵌入进去。给附件加个cid属性即可。

...
let mailOptions = {
  ...
  html: '<img data-original="cid:01">', // html body
  attachments: [
    {
      filename: 'ZenQcode.png',
      path: path.resolve(__dirname, 'ZenQcode.png'),
      cid: '01',
    }
  ]
};
...

使用模板引擎

邮件信息一般都不是固定的,我们可以引入模板引擎对HTML内容进行渲染。

这里我们使用Ejs:https://github.com/mde/ejs/来做演示

$ npm install ejs --save

ejs具体语法请参看官方文档

先建立一个email.ejs文件

<h1>hello <%= title %></h1>
<p><%= desc %></p>

修改我们的js文件

...
const template = ejs.compile(fs.readFileSync(path.resolve(__dirname, 'email.ejs'), 'utf8'));

const html = template({
  title: 'Ejs',
  desc: '使用Ejs渲染模板',
});

let mailOptions = {
  from: '"JavaScript之禅" <xxxxx@qq.com>', // sender address
  to: 'xxxxx@163.com', // list of receivers
  subject: 'Hello', // Subject line
  html: html,// html body
};
...

到此,你的邮箱将收到一个动态渲染的hello Ejs。

本文到此告一段落,在此基础上你可以实现更多有用的功能

HTML email 框架推荐

左手代码,右手砖,抛砖引玉

如果你知道更多好用HTML email资源,留言交流让更多人知道。

最后福利干货来了

36个国内外精致电子邮件HTML模版

产品周报类预览

投票

知乎周报

关注公众号【JavaScript之禅】回复【 666 】,免费获取

JavaScript之禅

查看原文

赞 49 收藏 54 评论 2

认证与成就

  • 获得 25 次点赞
  • 获得 28 枚徽章 获得 2 枚金徽章, 获得 7 枚银徽章, 获得 19 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-01-04
个人主页被 1.8k 人浏览