---
title: vue安裝
tags: 安裝套件 相關
---
## <font color=red>**vue安裝** </font>
# webpacker
rails webpacker:install:vue
在app/views/layouts/application.html.erb
```htmlembedded=
<head>
裡面添加<%= javascript_pack_tag 'hello_vue' %>
</head>
```
在app/javascript/packs/hello_vue.js
```javascript=
import Vue from 'vue/dist/vue.esm'
import App from '../app.vue'
document.addEventListener('DOMContentLoaded', () => {
const app = new Vue({
el: '#hello',
data: {
message: "Can you say hello?"
},
components: { App }
})
})
// 打開這段code,上半部註解掉
```
在隨便一個html.erb裡面加入就能看到效果
```htmlembedded=
<div id='hello'>
{{message}}
<app></app>
</div
```
# vu3 on rails
[文章連結](https://dev.to/vannsl/vue3-on-rails-l9d#install-npm-packages)
yarn add vue@next vue-loader@next @vue/compiler-sfc
## 配置環境
### 路徑設置
config/webpack/environment.js
```javascript=
const path = require("path")
const customConfig = {
resolve:{
alias: {
"@": path.resolve(__dirname, "..", "..", "app/javascript/src")
// import initVueApp from "@/main.js" 相當於 import initVueApp from "src/main.js"
// 單純把src/簡化為@/
}
}
}
environment.config.merge(customConfig)
// 把路徑稍微優化
```
### vue loader
config/webpack/environment.js
```javascript=
const { VueLoaderPlugin } = require("vue-loader")
const vue = require("./loaders/vue");
// 呼叫放在webpack/loader/vue的判斷式
environment.plugins.prepend(
'VueLoaderPlugin',
new VueLoaderPlugin()
)
environment.loaders.prepend('vue', vue)
// 告訴webpack遇到.vue檔時要怎麼做
```
在 config/webpack 下創一個 loaders 資料夾,裡面建一個vue.js檔
```javascript=
module.exports = {
test: /\.vue$/,
use: [{
loader: 'vue-loader'
}]
}
// 為了保持environment.js可讀性,把判斷式放到獨立的檔案內
```
### 設置 Vue 屬性
config/webpack/environment.js
```javascript=
const { DefinePlugin } = require("webpack")
environment.plugins.prepend(
'Define',
new DefinePlugin({
__VUE_OPTIONS_API__: false,
__VUE_PROD_DEVTOOLS__: false
})
)
// 方便後續打包
```
### environment.js最終模樣
```javascript=
const { environment } = require('@rails/webpacker')
const path = require("path")
const { VueLoaderPlugin } = require("vue-loader")
const { DefinePlugin } = require("webpack")
const vue = require("./loaders/vue");
const customConfig = {
resolve:{
alias: {
"@": path.resolve(__dirname, "..", "..", "app/javascript/src")
}
}
}
environment.config.merge(customConfig)
environment.plugins.prepend(
'VueLoaderPlugin',
new VueLoaderPlugin()
)
environment.plugins.prepend(
'Define',
new DefinePlugin({
__VUE_OPTIONS_API__: false,
__VUE_PROD_DEVTOOLS__: false
})
)
environment.loaders.prepend('vue', vue)
module.exports = environment
```
## 建立vue app
在app/javascirpt建立 src/components/HelloWorld.vue 這樣的資料夾路徑,HelloWorld.vue裡面寫
```htmlembedded=
<template>
<p>
{{ message }}
</p>
</template>
<!-- 渲染層 -->
<script>
import { ref } from 'vue'
export default {
name: 'HelloWorld',
setup() {
const message = ref('Hello World')
return {
message
}
}
}
</script>
<!-- js -->
<style scoped>
p {
font-size: 2em;
text-align: center;
}
</style>
<!-- css -->
```
javascript/src 建立 main.js,內容為
```javascript=
import { createApp } from 'vue'
import HelloWorld from '@/components/HelloWorld.vue'
// 引入創造vue實體的函式
// 引入HelloWorld的資料
export default () => {
document.addEventListener('DOMContentLoaded', () => {
const app = createApp(HelloWorld)
app.mount('#vue-app');
})
// 指到某個DOM標籤
}
```
javascript/packs/application.js 裡面寫入
```javascript=
import initVueApp from "@/main.js"
initVueApp()
// 引入js呼叫他
```
```
rails generate controller Home index
建立一個 Home controller 裡面建立 index 方法 views 也會長出erb檔
root to: 'home#index'
改個首頁
erb檔 加入<div id='vue-app'></div>這行
開foreman s 會有效果
```