Phoenix+Vue+Webpack 热重载模板

Phoenix默认的打包工具是Brunch,然而,目前最主流的打包工具肯定要属Webpack了,Vue官方也支持Webpack作为工具,我们来看一下如何把Phoenix,Vue,Webpack三者结合起来。

Vue CLI

首先我们看一下vue project的默认结构是怎么样的。

$ npm install -g vue-cli

安装vue-cli,vue项目模板生成工具。

它的使用方式是:

$ vue init <template-name> <project-name>

这里的template-name主要有以下五种:

  • webpack - A full-featured Webpack + vue-loader setup with hot reload, linting, testing & css extraction.
  • webpack-simple - A simple Webpack + vue-loader setup for quick prototyping.
  • browserify - A full-featured Browserify + vueify setup with hot-reload, linting & unit testing.
  • browserify-simple - A simple Browserify + vueify setup for quick prototyping.
  • simple - The simplest possible Vue setup in a single HTML file

这里我们主要看一下Webpack-Simple和Webpack这两个模板。其中Webpack模板包含的东西最为全面,涵盖了开发环境、测试环境、生产环境的配置以及完整的项目结构,我们以它为例。

Vue Webpack

首先看一下Vue Webpack模板的目录结构:

.
├── build/                      # webpack config files
│   └── ...
├── config/                     
│   ├── index.js                # main project config
│   └── ...
├── src/
│   ├── main.js                 # app entry file
│   ├── App.vue                 # main app component
│   ├── components/             # ui components
│   │   └── ...
│   └── assets/                 # module assets (processed by webpack)
│       └── ...
├── static/                     # pure static assets (directly copied)
├── test/
│   └── unit/                   # unit tests
│   │   ├── specs/              # test spec files
│   │   ├── index.js            # test build entry file
│   │   └── karma.conf.js       # test runner config file
│   └── e2e/                    # e2e tests
│   │   ├── specs/              # test spec files
│   │   ├── custom-assertions/  # custom assertions for e2e tests
│   │   ├── runner.js           # test runner script
│   │   └── nightwatch.conf.js  # test runner config file
├── .babelrc                    # babel config
├── .editorconfig.js            # editor config
├── .eslintrc.js                # eslint config
├── index.html                  # index.html template
└── package.json                # build scripts and dependencies

参照项目中的Integrating with Backend Framework这篇文档,我们来看一下如何与后端框架结合。

如果你构建的是纯静态Vue应用,即不和后端API一起部署,那么你不需要修改config/index.js。如果你要将Vue应用和其他后端框架一起使用,如Rails/Django/Laravel或是我们这里的Phoenix,那么你需要编辑config/index.js来为你后端项目直接生成前端资源。

默认的config/index.js如下:

var path = require('path')

module.exports = {
  build: {
    index: path.resolve(__dirname, 'dist/index.html'),
    assetsRoot: path.resolve(__dirname, 'dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    productionSourceMap: true
  },
  dev: {
    port: 8080,
    proxyTable: {}
  }
}

Phoenix

这里我们使用Webpack,所以在生成新项目时不使用Brunch。

$ mix phoenix.new --no-brunch pxvue
* creating pxvue/config/config.exs
...
* creating pxvue/web/views/page_view.ex

Fetch and install dependencies? [Yn] y
* running mix deps.get

We are all set! Run your Phoenix application:

    $ cd pxvue
    $ mix phoenix.server

You can also run your app inside IEx (Interactive Elixir) as:

    $ iex -S mix phoenix.server

Before moving on, configure your database in config/dev.exs and run:

    $ mix ecto.create

然后我们在phoenix的目录中使用vue-cli生成项目模板,这里首先使用mix phoenix.new生成项目再使用vue init生成项目的原因是前者不能在已有目录创建,后者考虑到和后端项目结合,能够在已有目录创建。

$ vue init webpack pxvue

? Target directory exists. Continue? Yes
? Project name pxvue
? Project description A Vue.js project
? Author loongmxbt <loongmxbt@gmail.com>
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Setup unit tests with Karma + Mocha? Yes
? Setup e2e tests with Nightwatch? Yes

   vue-cli · Generated "pxvue".

   To get started:

     cd
     npm install
     npm run dev

   Documentation can be found at https://vuejs-templates.github.io/webpack

我们来看一下现在主要有哪些文件夹:

.
├── _build
│   └── dev
│       └── lib
│           └── pxvue
├── build
├── config
├── deps
│   ├── connection
│   ├── cowboy
│   ├── cowlib
│   ├── db_connection
│   ├── decimal
│   ├── ecto
│   ├── fs
│   ├── gettext
│   ├── phoenix
│   ├── phoenix_ecto
│   ├── phoenix_html
│   ├── phoenix_live_reload
│   ├── plug
│   ├── poison
│   ├── poolboy
│   ├── postgrex
│   └── ranch
├── lib
│   └── pxvue
├── priv
│   ├── gettext
│   │   └── en
│   ├── repo
│   │   └── migrations
│   └── static
│       ├── css
│       ├── images
│       └── js
├── src
│   ├── assets
│   └── components
├── static
├── test
│   ├── channels
│   ├── controllers
│   ├── e2e
│   │   ├── custom-assertions
│   │   └── specs
│   ├── models
│   ├── support
│   ├── unit
│   │   └── specs
│   └── views
└── web
    ├── channels
    ├── controllers
    ├── models
    ├── static
    │   └── vendor
    ├── templates
    │   ├── layout
    │   └── page
    └── views

可以看到,主要的文件夹其实差不多,有的已经自动合并了内容,如configtest,但是,里面也有不太协调的部分,主要有这几个:

  1. build(vue)_build(phoenix),一个存放webpack配置文件,一个则是phoenix项目编译后的文件。
  2. static(vue)web/static(phoenix)priv/static(phoenix),均是存放静态资源文件。
  3. src(vue)web(phoenix)两者一个为前端代码,存放ui组件和资源,一个为后端代码,存放mvc相关代码。

这里我们如果需要修改build文件夹,比方说把它重命名为webpack,需要修改许多文件内容,其中包括了package.jsonkarma.conf.jse2e/runner.jswebpack.dev.conf.js里面的build/均改为webpack/

然后我们把config/dev.exs中对watchers进行修改。

watchers: [node: ["webpack/dev-server.js"]]

这里主要遇到的问题有两个:

  1. 这里webpack template运行的dev-server基于express之上
  2. Ctrl+C关闭Phoenix服务器时node进程没有退出,这是webpack的bug,需要添加flag--watch-stdin解决。

好了,现在从Hard模式积累了经验,重新回到Webpack-Simple模板再战!毕竟Webpack的模板比Webpack Simple的复杂太多,改起来也不方便是不。

Vue Webpack Simple

看一下Webpack Simple的目录结构,简洁明了。

.
├── README.md
├── index.html
├── package.json
├── src
│   ├── App.vue
│   └── main.js
└── webpack.config.js

我们将webpack.conf.js中的output修改为:

  output: {
    path: './priv/static/js',
    filename: 'app.js'
  },

dev.exs中的watchers修改为:

watchers: [node: ["node_modules/webpack/bin/webpack.js", "--watch-stdin", "--colors", "--progress"]]

现在,直接运行mix phoenix.server看到的会是Phoenix的默认主页,我们需要修改layout模板和index模板,来注入vue的内容。

app.html.eex中的body修改为:

<body>
  <%= render @view_module, @view_template, assigns %>
  <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
</body>

index.html.eex修改为:

<app></app>

修改App.vue中的template测试hot reloading:

可以看到:

至此,一个简单的Phoenix+Vue+Webpack 热重载模板就构建成功了。

关于 webpack-dev-server

Webpack-dev-server十分小巧,这里的作用是用来伺服资源文件,不能替代后端的服务器,因此如果你还要进行后端开发,就要采用双服务器模式:一个后端服务器和一个资源服务器(即Webpack-dev-server)。

[1] Webpack-dev-server结合后端服务器的热替换配置
[2] WEBPACK DEV SERVER

关于Phoenix和webpack-dev-server在后续文章中实践。

模板地址

扩展阅读

  1. Phoenix+Vue+Webpack 热重载模板
  2. Automatically Building Your Phoenix Assets With Webpack
  3. Phoenix and Vue.js(Brunch)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,266评论 4 31
  • 个人基于对 Vuejs 的学习制作了一个 Todo 单页应用 Lightodo,功能包括:添加待办事项卡片,对卡片...
    AlessiaLi阅读 21,542评论 16 308
  • 他和她一起十年,高中两年,大学四年,结婚生子四年。 一起的时候,她和他闹分手五年,闹离婚两年,闹分...
    掷筛子阅读 170评论 0 1
  • - [ ] 2016.03.19 - [ ] 想写下这篇文章好久了,直到今天妈妈再次因为我周末睡懒觉而大发雷霆写下...
    芬宝宝阅读 471评论 0 0
  • 我在黑暗里 在绝望里望你 你看着远处 向你招手的鹿
    餘生似我阅读 289评论 1 2