从零搭建vue项目、env 文件与环境变量和模式

安装配置

已经安装过node.js的情况下,开始吧~

1、全局安装vue-cli3.0脚手架工具

npm install -g @vue/cli

2、启动GUI创建项目向导

vue ui

可以看到创建vue项目的可视化界面,
 

image.png

3、点击创建新项目,下一步,就是按照自己的个人习惯喜欢进行配置,包管理器记得选择一下,根据个人喜好:我这里选择的是npm。
4、下一步之后选择手动配置项目;
创建项目功能的这一栏除了最后一项建议选上之外根据喜好来吧,项目创建之后,仍然可以通过安装插件来增加功能。
我这里选择了router、vuex等常用的插件:
image.png

5、选择标准配置,创建项目,大功告成~
image.png

6、在这里界面中通过左侧菜单可以查看项目创建结果目录及文件结构,默认安装了@vue/cli-service,@vue/cli-plugin-babel,
@vue/cli-plugin-eslint插件,依赖包及webpack相关配置


image.png

项目中也可以看到

image.png

devDependencies和dependencies的区别
在使用npm安装一些包时,经常要用到npm install这个命令,而对后面跟着的参数–save和–save-dev经常搞糊涂,那我们来看下这两者到底有啥区别。

  1. devDependencies用于本地环境开发时候所需要的依赖包。
  2. dependencies用户发布环境,生成上所需要的依赖包

  • 后面部分为–save -dev 的情况会使得下载的插件放在package.json文件的devDpendencies对象里面

  • 后面部分为–save的情况会使得下载的插件放在package.json文件的dependencies对象里面


区别

  • devDependencies下的依赖包,只是我们在本地或开发坏境下运行代码所依赖的,若发到线上,其实就不需要devDependencies下的所有依赖包;(比如各种loader,babel全家桶及各种webpack的插件等)只用于开发环境,不用于生产环境,因此不需要打包;
  • dependencies是我们线上(生产坏境)下所要依赖的包,比如vue,我们线上时必须要使用的,所以要放在dependencies下;dependencies依赖的包不仅开发环境能使用,生产环境也能使用
  • 例如:
    babel-plugin-transform-remove-console这个插件是线上环境打包去掉console.log,本地及测试环境保留。是在npm run build的时候需要用到这个插件,并不是生产环境下代码运行依赖于这个插件,所以,babel-plugin-transform-remove-console应该在安装时加上–save -dev,出现在devDependencies中

我们可以使用任务-serve里面的工具来运行项目,解放双手

image.png

可视化工具配置vue.config.js文件

image.png

关于vue.config.js具体配置我之前的文章有详细的解析,webpack 充当着举足轻重的作用,比如打包压缩、异步加载、模块化管理等等。贴上链接

现在我们已经搭建好了一个简单的vue项目。
参考文章:https://blog.csdn.net/qq_42893625/article/details/102540535
https://www.jb51.net/article/152030.htm

env 文件与环境变量和模式

https://www.cnblogs.com/sese/p/11905402.html
先看官网:环境变量和模式

process.env 为何物
process.env 是 Node.js 中的一个环境对象。其中保存着系统的环境的变量信息。可使用 Node.js 命令行工具直接进行查看。

image.png

NODE_ENV就是其中的一个环境变量。这个变量主要用于标识当前的环境(生产环境,开发环境)。默认是没有这个环境变量的,需要自己手动配置。不同系统有不同的环境变量配置方式,在这里就不多加赘述。

image.png

也就是说,在 Vue 中, NODE_ENV可以通过 .env文件或者 .env.[mode]文件配置。配置过后,运行 Vue CLI 指令( npm run dev(serve) ,npm run build )时,就会将该模式下的NODE_ENV载入其中了。而这些命令,都有自己的默认模式:

  • npm run dev(serve) ,其实是运行了vue-cli service serve ,默认模式为 development 。可以在.env.development文件下修改该模式的 NODE_ENV
  • npm run build,其实运行了 vue-cli service build ,默认模式为production 。可以在 .env.production文件下修改该模式的 NODE_ENV

我个人理解:
执行 npm run serve 时,对应的环境默认就是开发环境;
执行 npm run build 时,对应的环境默认就是生产环境;


1、配置文件
一般一个项目都会有以下 3 种环境:- 开发环境- 测试环境- 生产环境
我们可以在根目录下创建以下形式的文件进行不同环境下变量的配置:

.env # 在所有的环境中被载入
.env.local # 在所有的环境中被载入,但会被 git 忽略
.env.[mode].local # 只在指定的模式中被载入,但会被 git 忽略
.env.[mode] # 只在指定的模式中被载入

如官方文档所说,通过为.env文件增加后缀来设置某个模式下特有的环境变量。


image.png

我这里创建一个名为 .env.stage的文件,该文件表明其只在 stage(测试)环境下被加载,在这个文件中,我们可以配置如下键值对的变量:

NODE_ENV=stage//环境名称
VUE_APP_TITLE=stage mode
VUE_APP_BASE_URL = 'groupClient'
VUE_APP_BASE_API = '/massgroup'

这时候我们怎么在 vue.config.js 中访问这些变量呢?很简单,使用 process.env.[name] 进行访问就可以了,比如:

// vue.config.js的service.interceptors.response.use(res => {中

console.log("当前环境变量:"+process.env.NODE_ENV) // development(在终端输出)
console.log("当前环境路径:"+process.env.VUE_APP_BASE_URL)
console.log("当前环境路径:"+process.env.VUE_APP_BASE_API)

当你运行 npm serve 命令后会发现输出的是 development,因为 vue-cli-service serve 命令默认设置的环境是development,你需要修改 package.json 中的 serve 脚本的命令为:

"scripts": {
    "serve": "vue-cli-service serve --mode stage",
}

--mode stage其实就是修改了 webpack 4 中的 mode 配置项为 stage,同时其会读取对应 .env.[model]文件下的配置,如果没找到对应配置文件,其会使用默认环境 development,同样 vue-cli-service build 会使用默认环境 production。

这时候如果你再创建一个 .env 的文件,再次配置重复的变量,但是值不同,如:

NODE_ENV=staging
VUE_APP_TITLE=staging mode
VUE_APP_NAME=project

因为.env 文件会被所有环境加载,即公共配置,那么最终我们运行 vue-cli-service serve 打印出来的是哪个呢?答案是 stage,但是如果是 .env.stage.local 文件中配置成上方这样,答案便是 staging,所以 .env.[mode].local 会覆盖 .env.[mode] 下的相同配置。同理 .env.local 会覆盖 .env 下的相同配置。
由此可以得出结论,相同配置项的权重:

.env.[mode].local > .env.[mode] > .env.local > .env 

但是需要注意的是,除了相同配置项权重大的覆盖小的,不同配置项它们会进行合并操作,类似于 Javascript 中的 Object.assign 的用法。

2、环境注入
通过上述配置文件的创建,我们成功使用命令行的形式对项目环境进行了设置并可以自由切换,但是需要注意的是我们在 Vue 的前端代码中打印出的 process.env 与 vue.config.js 中输出的可能是不一样的,这需要普及一个知识点:webpack 通过 DefinePlugin 内置插件将 process.env 注入到客户端代码中。

// webpack 配置
{
    ...
    
    plugins: [
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: JSON.stringify(process.env.NODE_ENV)
            }
        }),
    ],
    
    ...
}

由于 vue-cli 3.x 封装的 webpack 配置中已经帮我们完成了这个功能,所以我们可以直接在客户端代码中打印出 process.env 的值,该对象可以包含多个键值对,也就是说可以注入多个值,但是经过 CLI 封装后仅支持注入环境配置文件中以 VUE_APP_ 开头的变量,而 NODE_ENV 和 BASE_URL 这两个特殊变量除外。比如我们在权重最高的 .env.stage.local 文件中写入:

NODE_ENV=stage2
VUE_APP_TITLE=stage mode2
NAME=vue

然后我们尝试在 vue.config.js 中打印 process.env,终端输出:

{
    ...
    
    npm_config_ignore_scripts: '',
    npm_config_version_git_sign: '',
    npm_config_ignore_optional: '',
    npm_config_init_version: '1.0.0',
    npm_package_dependencies_vue_router: '^3.0.1',
    npm_config_version_tag_prefix: 'v',
    npm_node_execpath: '/usr/local/bin/node',
    NODE_ENV: 'stage2',
    VUE_APP_TITLE: 'stage mode2',
    NAME: 'vue',
    BABEL_ENV: 'development',
    
    ...
}

可以看到输出内容除了我们环境配置中的变量外还包含了很多 npm 的信息,但是我们在入口文件 main.js 中打印会发现输出:

{
    "BASE_URL": "/vue/",
    "NODE_ENV": "stage2",
    "VUE_APP_TITLE": "stage mode2"
}

可见注入时过滤调了非 VUE_APP_ 开头的变量,其中多出的 BASE_URL 为你在 vue.config.js 设置的值,默认为 /,其在环境配置文件中设置无效。


image.png

因为在安装时选择了eslint,就会有一些莫名其妙的格式规范的报错。(尝试了瓦网上说的很多办法都不可以)
我们在项目中的vue.config.js文件里加上:

// vue.config.js
module.exports = {
    lintOnSave: false
}

重启下项目,现在就可以了

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

推荐阅读更多精彩内容