vue buid及部署踩坑记录

## build

在vue项目build有两个需求:

-  动态指定环境变量配置(dev、test、production环境打包时对应特定的环境变量配置)

-  减少项目build后的体积和加快项目build速度

#### 动态指定环境变量配置

你可以通过在根目录下书写.env.[mode]文件来指定环境变量,示例如下:

```key

.env 在所有环境中被载入配置

.env.production build时默认载入配置

.env.local 等价于.env,但会被.git忽略

```

.env 文件的内容是“key=value”这种的一个个键值对,key必须已VUE_APP_开头才可以被webpack.DefinePlugin静态嵌入到客户端侧的包中。为一个特定模式准备的环境文件 (例如 .env.production) 将会比一般的环境文件 (例如 .env) 拥有更高的优先级。

vue-cli有三个默认模式,示例如下:

```key

development模式,用于vue-cli-service serve

test模式,用于vue-cli-service test:unit

production模式,用于vue-cli-service build or vue-cli-service test:e2e

```

你可以通过 --mode 选项来覆写默认的模式,vue-cli-service --mode test 将载入.env.test和.env.test.local配置文件。

在客户端侧代码中,你可以通过 process.env.VUE_APP_*来访问它们,示例如下:

```key

.env 文件配置

VUE_APP_NAME=你好呀

代码访问

console.log(process.env.VUE_APP_NAME)

```

#### 减少项目build后的体积和加快项目build速度

##### 减少项目build后的体积

1. 对于有些库,对于库中的功能用的非常少的,可以去掉(我去掉了jquery以及lodash),用到的地方,参考源码自己写

2. 非用不可的又比较大的库(我这里用了monaco-edit),使用cdn方式引入

##### 加快项目build速度(DLLPlugin 插件)

项目中都会依赖很多第三方包,但是除非版本升级,一般这些第三方包都不太会发生变更,那么在每次build时,这些文件如果能提前build好,项目build只是引入这些第三方包build后的文件,那么将可以提升项目的build速度,DLLPugin插件即是起到该作用的工具。

DLLPugin包含DLLPlugin、DLLReferencePlugin,DLLPlugin用于创建只有dll的bundle(dll-only-bundle)以及manifest.json 的文件,DLLReferencePlugin通过该文件映射到相应的依赖中(build好的依赖)。

```key

新建vue.config.js,配置如下:

module.exports = {

    pluginOptions: {

      dll: {

        entry: ["core-js", 'vue', 'vue-router', "element-ui", "node-rsa"]

      }

    }

  }

```

但上述配置依赖都打包在一个文件中,文件过大会导致请求阻塞,DLLPlugin提供配置可以将依赖分别build到不同的文件,示例如下:

```key

module.exports = {

    pluginOptions: {

      dll: {

        entry: {

vue: ["core-js", 'vue', 'vue-router'],    # vue.*.dll.js

other: [ "element-ui", "node-rsa"]    # other.*.dll.js

}

      }

    }

  }

```

### 部署

vue项目build后生成文件目录,如下:

```

├── css

│   └── app.08315448.css

├── favicon.ico

├── img

│   └── logo.82b9c7a5.png

├── index.html

├── js

│   ├── app.d8650714.js

│   ├── app.d8650714.js.map

│   └── dll.561e88a2.dll.js

```

本质即是部署静态文件,使之可以被访问。但这里有个特殊的点是vue-router的history模式,示例如 http://localhost:8080/path ,在npm run serve部署开发环境时,是由node运行了一个服务端环境来代理静态资源的访问,它对于所有页面的访问实际都以index.html来响应,http://localhost:8080/path 实际path部分是通过在浏览器端的js路由代码来控制响应,无实际跳转。所以部署history模式的vue项目时需要注意满足这一点。使用nginx代理时,可以通过配置try_files来满足这一特性。我们使用vue项目时,一般都会有配套的后端api服务项目,如果不希望部署那么复杂,完全可以把vue项目的build后文件放置到后端api服务项目中,在后端程序书写访问控制代码,从而达到前后端项目独立开发,但统一部署,减少运维复杂度。示例基于python flask的后端服务:

```key

# 设置静态文件、模版文件都指向dist目录

app = Flask(__name__, template_folder="../dist", static_folder="../dist")

# 将前端路由控制的url访问全部交由该控制器处理响应

@app.errorhandler(404)

def index():

return render_template("index.html")

```

静态css、js等文件有flask的static控制器控制访问,其它前端路由控制的访问交由errorhandler(404)来响应

### 其它

linux try_files 命令介绍

语法规则

1. try_files file ... uri;

2. try_files file ... =code;

可应用上下文 server, location,命令具体含义指按指定的file顺序查找存在的文件,并使用第一个找到的文件进行请求处理,查找路径是按照给定的root或alias为根路径来查找的,如果给出的file都没有匹配到,则重新请求最后一个参数给定的uri,就是新的location匹配,如果是格式2,最后一个参数是 = 404 ,若给出的file都没有匹配到,则最后返回404的响应码。示例如下:

```key

示例一

location /images/ {

    try_files $uri /images/default.gif;

}

示例二

location / {

    try_files $uri $uri/index.html $uri.html =404;

}

示例三

location / {

    try_files /system/maintenance.html

              $uri $uri/index.html $uri.html

              @mongrel;

}

location @mongrel {

    proxy_pass http://mongrel;

}

```

$uri 这个变量指当前的请求URI,不包括任何参数(见 𝑎𝑟𝑔𝑠)。

### 参考

https://cli.vuejs.org/zh/guide/mode-and-env.html

https://www.webpackjs.com/plugins/dll-plugin

https://juejin.im/post/6844903734007300109

https://cli.vuejs.org/guide/deployment.html

https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

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