草庐IT

vue项目启动命令个人笔记

追逐梦想永不停 2023-05-30 原文

一、前言

最近在看vue框架,发现启动命令逻辑比较复杂,在这里总结一波。

注意,下面的总结以本人的项目为例,不同项目可能细节不同,仅供参考。

二、启动命令详解

1.项目启动前,需要先装好nodejs,并用npm install安装好依赖。

2.本人的项目中,vue启动命令为:

npm run compile

其中,npm run xxx会执行package.json中配置的命令,例如package.json中,有:

  "scripts": {
    "compile": "cross-env SERVER_ENV=test node build/dev-server.js",
  },

所以实际执行的会是cross-env SERVER_ENV=test node build/dev-server.js命令。

3.cross-env命令,作用是实现跨平台配置环境变量,SERVER_ENV=test就是自己配置的一个环境变量,后续js等文件会用到。
(就是windows和linux都可以用 cross-env key=value 来配置环境变量的意思)

4.node命令,可以执行js文件,所以node build/dev-server.js实际执行的就是项目根目录/build/dev-server.js文件。
(因为是在项目根目录执行的npm run compile命令,所以build/dev-server.js就是从项目根目录开始的;其中dev-server.js是自己编写的一个js文件)

5.dev-server.js文件中,有:

//这个会打印test,上面配置的环境变量
console.log("env1",process.env.SERVER_ENV)
//这个会打印prod,因为没有配置ENV1
console.log("env2",`"${process.env.SERVER_ENV1 || 'prod'}"`)
//这个会打印test,上面配置的环境变量
console.log("env3",`"${process.env.SERVER_ENV || 'prod'}"`)

const config = require('../config')
//这个打印内容
console.log("config",config)

这个的意思是,声明一个变量config,内容是当前js文件的、上一个目录中的、config文件夹中的index.js文件。(自己编写的index.js文件)
注意,只读取文件夹下的index.js文件,不读取其它js文件。

6.config/index.js文件中,有:

//这个是读取node_modules的path依赖,解析路径用的(类似jar包)
const path = require('path')

//这个是读取同级目录下的test.js文件
const testEnv = require('./test')

module.exports = {
  test: {
    env: testEnv,
    port: 10001,
    assetsSubDirectory: 'static',
    assetsPublicPath: process.env.SERVER_ENV === 'test' ? '/sub-path-test/' : '/sub-path/',
    proxyTable: {
      api: {
        filter: '/sub-path-test/**',
        changeOrigin: true,
        target,
        onProxyReq(proxyReq) {
          proxyReq.setHeader(
            'Cookie', `SESSION=6b7c231d-1133-40cf-c566-332f6dtxfa72`
          )
        },
      },
    },
  },
}

这个文件中,因为有module.exports,所以第5步中可以require到。
这个文件中,有个变量testEnv,配置到了module.exports的json串中,它的值下面会写。

7.config/test.js文件中,有:

//这个也是node_modules里的依赖方法,用来合并成json用
const merge = require('webpack-merge');

//这个读取的是同级目录下的prod.js文件
const prodEnv = require('./prod');

//这个把json合并了下,然后exports了
module.exports = merge(prodEnv, {
  TEST_ENV: '"test_env"',
});

8.config/prod.js文件中,有:

module.exports = {
  PROD_ENV: '"prod_env"',
};

9.现在,回到dev-server.js文件(第5步),其中的config变量的内容为:

config {
  test: {
    env: { TEST_ENV: '"test_env"', PROD_ENV: '"prod_env"' },
    port: 10001,
    assetsSubDirectory: 'static',
    assetsPublicPath: '/sub-path-test/',
    proxyTable: { api: [Object] }
  }
}

10.dev-server.js文件中,主要有以下代码:

//node_modules里的依赖,框架方法
const express = require('express')
//执行这个方法,获得返回值
const app = express()



//node_modules里的依赖,解析路径用
const path = require('path')
//从config对象(json)里获取到子路径相关
//posix是一种平台兼容写法,与join相同,也是把路径拼接起来
//staticPath="/sub-path-test/static"
const staticPath = path.posix.join(
  config.test.assetsPublicPath,
  config.test.assetsSubDirectory
)
//配置虚拟子路径、以及静态资源目录
//意思是,访问/sub-path-test/static时,访问的类似是当前目录(一般是dist目录)下的static文件夹中的内容
//例如,http://localhost:10001/sub-path-test/static/a.png,访问的就是static文件夹里的a.png
app.use(staticPath, express.static('./static'))



//启动项目,设置启动后的端口,10001
const port = config.test.port
module.exports = app.listen(port, err => {
  if (err) {
    console.log(err)
  }
})

这段代码的意思是,使用了express框架,设置了一个虚拟访问路径与静态资源目录,设置了一个项目启动端口。
例如,访问http://localhost:10001/sub-path-test/static/a.png,访问的类似是static文件夹里的a.png
注意,项目打包后,在dist文件夹中、会生成a.png;
不过,只启动项目的话,并不会打包、dist文件夹是空的,不过也能访问到,是框架实现的。

11.dev-server.js文件中,还用到了:

//node_modules依赖方法
const webpack = require('webpack')
//自己配置的一个js文件
const webpackConfig = require('./webpack.dev.conf')
//调用了下webpack方法
const compiler = webpack(webpackConfig)
//获得了个变量devMiddleware
const devMiddleware = require('webpack-dev-middleware')(compiler, {
  //总之,这个的值也是 config.test.assetsPublicPath,就是"/sub-path-test/"
  publicPath: webpackConfig.output.publicPath,
  noInfo: false,
  quiet: false,
  stats: {
    colors: true,
  },
})

//给app设置了下
app.use(devMiddleware)

这段还没有全看明白,总之就是设置了个publicPath,也是/sub-path-test,感觉类似express.static那里。
实现的效果是,当访问http://localhost:10001/sub-path-test/user/user-detail.html时,访问的实际上类似是.../dist/user/user-detail.html。(是/user/user-detail/app.vue等文件最后生成的user.html文件,如果打包的话就能看到了。)

注意,只启动项目的话,并不会打包、dist文件夹是空的,不过也能访问到,是框架实现的。

12.可以根据环境变量不同、配置不同的虚拟访问路径(例如测试用sub-path-test、生产用sub-path);
然后就可以在nginx中、根据某些变量不同、访问不同的路径、就是访问不同的环境(例如某些人的账号访问测试、某些人的账号访问准生产等,用来自测);
然后可以在公共js方法中,做一些判断,如果是测试url、或者如果环境变量是test、就在发送请求方法处增加setHeader('Cookie','asd-adf-ad-123-adf')等方法,用来自测。

三、总结

1.上方的启动命令与相关文件,是根据本人的项目总结的,仅供参考,不同项目细节可能不同。

2.项目启动命令可以自己配置,过程如上,需要熟悉node_modules中的一些依赖方法。(本人新学,好多都不熟悉,无从入手,只能先看,总结一波自己理解的)

3.可以配置本地vue项目启动时、端口号与访问前缀路径;
需要注意的是,项目打包部署到服务器上后又会有所区别,服务器上主要是在nginx中配置访问端口与前缀路径的,而不是在vue项目中。

有关vue项目启动命令个人笔记的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  5. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  6. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  7. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  8. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

随机推荐