With create-react-app one could use process.env.REACT_APP_VERSION for this.
Is there an equivalent in Vite?
With create-react-app one could use process.env.REACT_APP_VERSION for this.
Is there an equivalent in Vite?
 
    
    Add a define to your vite.config.ts:
import react from '@vitejs/plugin-react';
import { defineConfig } from 'vite';
export default defineConfig({
  plugins: [react()],
  define: {
    APP_VERSION: JSON.stringify(process.env.npm_package_version),
  },
});
If you haven't got one already, define a vite-env.d.ts or env.d.ts and add a declare:
declare const APP_VERSION: string;
You'll now be able to use the variable APP_VERSION anywhere in your code & Vite will substitute it at compile time.
Note: You may need to restart your TS server for the declaration to be picked up by intellisense:
VSCode MacOS: ⌘ + ⇧ + P > Restart TS Server
VSCode Windows:  ctrl + ⇧ + P > Restart TS Server
If you want to use plugin, see Adarsh's answer
But it's very easy to implement it yourself.
You can use define in vite.config.js. Read about it here
vite.config.js
export default {
    plugins: [vue()],
    define: {
        '__APP_VERSION__': JSON.stringify(process.env.npm_package_version),
    }
}
component.vue
<template>
    <div>{{ version }}</div>
</template>
<script>
export default {
    data () {
        version: __APP_VERSION__
    },
}
</script>
or with <script setup>
<script setup>
const version = __APP_VERSION__
</script>
<template>
    <div>{{ version }}</div>
</template>
You should be able to change '__APP_VERSION__' as long as it doesn't conflict with javascript syntax or other variables.
 
    
    This worked for me.
I imported package.json in vite.config.ts and defined a PACKAGE_VERSION environment variable.
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import packageJson from './package.json';
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  define:  {
    'import.meta.env.PACKAGE_VERSION': JSON.stringify(packageJson.version)
  }
})
I added "resolveJsonModule": true to the compiler options of  tsconfig.node.json.
I added "./package.json" to the include array of  tsconfig.node.json
{
  "compilerOptions": {
    "composite": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "allowSyntheticDefaultImports": true,
    "resolveJsonModule": true
  },
  "include": ["vite.config.ts", "./package.json"]
}
In order to make intellisense work for PACKAGE_VERSION, I added it to vite-env.d.ts
interface ImportMetaEnv {
    readonly PACKAGE_VERSION: string;
    // more env variables...
}
  
interface ImportMeta {
    readonly env: ImportMetaEnv
}
I could use {import.meta.env.PACKAGE_VERSION} anywhere in my react app to show the package version.
 
    
    Simplest solution
// .env
VITE_REACT_APP_VERSION=$npm_package_version
// App.jsx
...
console.log('ver. ', import.meta.env.VITE_REACT_APP_VERSION)
...
 
    
    If you don't want to use define, there is a vite plugin for just this.
https://www.npmjs.com/package/vite-plugin-package-version
// vite.config.js
import loadVersion from 'vite-plugin-package-version';
export default {
  plugins: [loadVersion()],
};
Will inject import.meta.env.PACKAGE_VERSION with the version specified in your package.json.
 
    
    This worked for me:
import { version } from '../../package.json'
 
    
    In case anyone is interested, this automatically increases the version in package.json and makes it available to the application.
import { defineConfig } from 'vite';
const increasePackageVersion = () => {
    try {
        const fs = require('fs');
        const path = require('path');
        const packageFilePath = path.join(__dirname, 'package.json');
        const packageJson = JSON.parse(fs.readFileSync(packageFilePath, 'utf8'));
        packageJson.version = packageJson.version.replace(/(\d+)$/, (match, p1) => {
            return parseInt(p1) + 1;
        }
        );
        fs.writeFileSync(packageFilePath, JSON.stringify(packageJson, null, 2));
        console.log('New version is', packageJson.version);
    } catch (error) {
        console.log('Error in increasePackageVersion', error);
    }
};
export default defineConfig({
    build: {
        lib: {
            entry: 'src/main.js',
            formats: ['es']
        }
    },
    plugins: [
    increasePackageVersion()],
    define: {
        '__APP_VERSION__': JSON.stringify(process.env.npm_package_version),
    }
});
console.log(__APP_VERSION__);
 
    
    Secure Way of Importing Vue version.
Incrementing semantic versions using npm commands
 
    
    I have used this with React, typescript and vite.
Here is what worked for me and why:
Added the version to: vite.config.ts
export default defineConfig({
  define: {
    `config.version`: JSON.stringify('my-custom-name')
  }
})
This will prevent the typescript from creating an issue for not declaring global config.
On this file: src/vite-env.d.ts
Added the next line
declare var config: any;
I used the variable inside the react function as any normal variable:
const { version } = config;
I used this on the open sauced project at this PR: https://github.com/open-sauced/ai/pull/141/files in case if you want to check the relevant code.
It would be helpful to reference the next questions as well:
 
    
    Specifying VITE_VERSION=${npm_package_version} in .env works for me. The version is available under import.meta.env.VITE_VERSION. Tested on vite version 4.4.5.
