开发时主要在 src 资料夹进行开发,最後打包输出时是 dist 资料夹。在 src 里,一定会用到 assets, components, views 以及 main.js 档案。assets 用作放静态资源,components 放元件,views 放页面元件,而 main.js 则是整个应用程序的进入点,意思是需要经 Webpack 编译的档案都需要在这里引入。
此篇文章我会使用 Vue CLI 创建档案,并设定加入 ESLint、 CSS 预处理器、Vue router、Vuex 来作说明。
为了缩短篇幅,此图没显示 gitignore
、babel
、node_modufles
等档案和资料夹。
<img src="./assets/logo.png">
最後一点也真的很方便!有时候改了一些样式,但因为档名没更动过,因此浏览器会以为没有什麽更动,因而继续显示缓存的档案。所以,常听说有些做法是在档案名称後加 timestamp 来强制浏览器更新。但如果用了 Webpack,因为输出的档案名称会带 hash,因此就能放心了,不用再用在档案名上加 timestamp 之类的手法。
src/assets
里。.vue
档案引入任何静态资源,它们都会被 Webpack 编译,并被视为该 module 的依赖。所以,大部分情况是建议把静态资源放在 src/assets 里,但官方网站也有提到一些需要用到 public 的原因,例如函式库与 webpack 不相容。
另一个比较明显的例子是,这篇文章有提到,假设我要用 v-html
来显示放在 src/assets
里的 logo.png
,并在 DOM 里塞入 <img src="../assets/logo.png">
这样的内容来引入 logo.png
,最後是无法显示图片,因为输出时会直接当成字串输出 ../assets/logo.png
,没有经过编译,因此并非正确路径。解决方法是我们需要在 public 引入 logo.png
。
详细完整示范:https://codesandbox.io/s/vue-cli-ru-he-yong-v-html-xian-shi-tu-pian-50rn1?file=/src/App.vue
components 是放元件,views 是放页面元件。一个页面元件上会由多个元件组成。
以 https://example.com/#/products
这个 products
页面为例。已知我们一定会有一个叫 Products.vue
作为页面元件。假如在此页面上,顶部有一个 swiper 轮播图片,下方是一个个卡片来显示每个产品。这情况可能就会出现两个档案,Swiper.vue
和 ProductCard.vue
。
src/
components/
Swiper.vue
ProductCard.vue
views/
Products.vue
在建立 Vue CLI 时,可以选择加入 Vue router 和 Vuex,前者会建立一个 router 资料夹,後者则是 store 资料夹,并且会自动在 main.js
引入这些资料夹。
App.vue 是根元件。所有元件都会挂载在这个元件上。当我们切换页面,其实就是在 App.vue 此根元件里切换显示不同元件。
main.js 是我们整个应用程序的进入点。把所有此应用程序用到的模组全都 import
进去 main.js。之後 webpack 就会编译这个档案,输出浏览器看得懂的档案。概念如下:
因为浏览器只看懂 HTML、CSS 和 JavaScript 档案,看不懂 .vue
、.scss
这些档案,所以需要透过 Webpack 此工具去编译,输出 HTML、CSS 和 JavaScript 档案。
注意,所有在 main.js 引入以及有关连的档案,才会被 webpack 编译。
补充一点,因为 Vue 预设是 SPA 框架,所以只会有一个进入点档案(main.js)。但如果想使用 MPA(多页式应用),就需要我们自己建立其他进入点档案。例如建立一个 product.js
(进入点档案),以及 product.html
(页面档案)。之後在 vue.config.js
再做相关的设定,详细可参考 Kuro 大大这篇的文章说明。
所谓打包,透过在终端机输入 npm run build
指令,以 webpack 编译,最後输出 HTML、CSS 和 JavaScript 档案,并被放在 dist
资料夹里:
如果是静态应用程序,例如此专案只是串接公共 API ,我们只需把此 dist 资料夹部署到 GitHub Pages、Netlify 等静态网页托管服务上。以下用部署到 GitHub Pages 作为例子。
因为 Vue Cli 预设你所部署的 domain 是在根路径'/'
,例如 https://my-vue-app.com/
。如果是在子路径,例如 https://github.com/alysachan830/my-vue-app/#/
,就要设定 publicPath
为 /my-vue-app/
。
如果你是使用 Vue 3,做法就是在根目录建立 vue.config.js
,内容如下:
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/my-vue-app/'
: '/'
}
以上做法能够在打包後,使 dist 里的index.html里所载入的js、css档案路径都改回正确的相对路径
以下的资源详细说明了以上步骤。
关於 vue.config.js的设定可看这篇:
https://tzuhui.github.io/2020/03/02/Vue/Vue-CLI3-to-github-pages/
原因细节可参考这个影片:
https://www.youtube.com/watch?v=njlABvVRB68&ab_channel=%E5%85%AD%E8%A7%92%E5%AD%B8%E9%99%A2
(大概54:25开始)
关於第 2 点的流程,可看这篇:
https://hsiangfeng.github.io/vue/20190513/948497494/
此外,如果是需要与後端程序做串接,就把此 dist 资料夹放到後端的服务器资料夹里,并把路由指向 dist 资料夹中 index.html 的位置,最後由後端处理部署。如果是用 Express.js 作为後端框架,可参考这篇文章,示范如何设定後端路由来连接 Vue。
publicPath
。npm run build
来进行编译,最後会输出 dist 资料夹以及 HTML、CSS、JavaScript 档案。因为浏览器只能读取这三种档案,所以需要进行以上提到的编译动作。How to Structure a Large Scale Vue.js Application
Vue CLI 环境设定与打包部署
How To Develop and Build Vue.js App With NodeJS
Vue 2.x & Vue CLI 3 配置与静态档引用路径
<<: 铁人赛 Day13 -- 一定要知道的JQuery (一) -- Click点击关闭盖板广告
今天开始会有两天来介绍简单的应用场景,会建置完整的 NiFi Data Pipeline 来让大家知...
昨天已经把JSON档建置好了!今天就可以取用JSON档的资料然後实作出Methods和Compute...
往往我们在拿到一份资料时,数据都是很大很恐怖的 而且我们并无足够的时间将每个数值好好得看过一遍 pa...
介绍完了前几天的 sass 各种用法,大家有没有觉得有些方法好像很类似? 像是 mixin 跟 ex...
在上篇中,我们是需要到 Line Notify 登入後的个人介面发行 token,但总不能叫每一个加...