where to find or how to set htmlWebpackPlugin.options.title in project created with vue cli 3?

31,929

Solution 1

Looking at the popularity of the question, I decided to add an elaborate answer with references to make it more authentic and complete. I have also created an article on this topic and covered this topic in this and this courses.

Though the question is looking for setting htmlWebpackPlugin.options.title, the ultimate effect is changing the title of the web-page.

1. Most convenient and trivial solution

The simplest way to do this is to modify the public/index.html and hard-code the title.

<!DOCTYPE html>
<html lang="">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>
        <%= htmlWebpackPlugin.options.title %>
    </title>
</head>

<body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
</body>

</html>

This is the default public/index.html that is generated by vue cli. And in this, you just need to change

    <title>
        <%= htmlWebpackPlugin.options.title %>
    </title>

to

<title>Title of your choice</title>

2. Change the name field in package.json

Another simple solution is to change the "name": "your-project-name". However, there are many restrictions on the name you can use in package.json. You can read more about this here. Basically, package.json must contain a name and that must be lowercase and one word, and may contain hyphens and underscores.

3. Using pages field in vue.config.js

vue.config.js is an optional file that you can add to provide additional configurations to Vue CLI and this file, if present, will be automatically loaded by Vue CLI. You need to create vue.config.js in the root folder - the folder containing you package.json file.

According to Vue documentation, you can use pages field to define entrypoint for multi-page app. However, you can also use this to define title for single page app as well. Create vue.config.js in the root directory and add pages field to your exports as follows:

module.exports = {
  pages: {
    index: {
      // entry for the page
      entry: 'src/main.js',
      title: 'My Title',
    },
  }
}

Note that if you are already running development server, this change will be reflected only when you stop and restart the development server. In other words, these changes will not be hot reloaded.

4. Chaining Webpack

You can chain Webpack in vue.config.js as shown below

module.exports = {
    chainWebpack: config => {
        config
            .plugin('html')
            .tap(args => {
                args[0].title = "My Vue App";
                return args;
            })
    }
}

Note that similar to solution 3, this change will be reflected only when you stop and restart the development server, in case you are already running development server. In other words, these changes will not be hot reloaded.

5. Modify title in lifecycle hooks using JavaScript

The next solution in the list is to use JavaScript to modify the title. You can do this either in mounted lifecycle hook of your root component or if you want different title for different routes, you can do the same for components loaded by each route.

<script>
export default {
  data() {
    return {
      //
    };
  },
  mounted() {
    document.title = 'new title'
  }
}
</script>

6. Use Vue Meta

Finally you can use Vue Meta to manage all metadata for your Vue app including title. First you need to add Vue Meta to your project and then use metaInfo field as shown below to configure metadata for your page or route.

{
  metaInfo: {
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { title: 'My title'}
    ]
  }
}

Conclusion

The first 4 solutions are static ways of changing your title or in other words you can't change your title at runtime using these ways. Also all of these are not hot reloaded. The last 2 options use JavaScript and can manipulate the title at runtime.

Solution 2

create a file vue.config.js at the root

//vue.config.js
module.exports = {
    chainWebpack: config => {
        config
            .plugin('html')
            .tap(args => {
                args[0].title = "My Vue App";
                return args;
            })
    }
}

see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-plugin

Solution 3

Update the name property in your package.json file

{
  "name": "URL-friendly_app-name",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build"
  },
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

Update: The above mentioned method will only work if you use a URL friendly title.

There are a couple of other ways to do it

  • From the Vuejs official documentation Pages Configuration, you can use the html plugin configuration specify th title for different pages
  • Use the environement variables Modes and Environment Variables to hold your app/page title. I personally prefer and use this method.

.env (or any .env.[mode])

VUE_APP_NAME=Application flixible name

And this is how you call it in different places in your app

AnyComponent.vue (as a data property)

TypeScript

appName: string = process.env.VUE_APP_NAME

Javascript

appName: process.env.VUE_APP_NAME

anyHTML.html

<%= process.env.VUE_APP_NAME %>
Share:
31,929
mayank1513
Author by

mayank1513

Looking for Job Looking for Opportunity - rewarding career in field of Research / Software Research / Education / Android Engineering / Android Application Development / Front End Development. Resume and certs - https://mayank-chaudhari.web.app/ Android Apps - https://play.google.com/store/apps/dev?id=5009060970068759882 Github - https://github.com/mayank1513/

Updated on July 08, 2022

Comments

  • mayank1513
    mayank1513 almost 2 years

    I wanted to set title to my webpage created with vue cli 3 and thus looked into public/index.html. There, I found <title><%= htmlWebpackPlugin.options.title %></title>.

    How do I set and modify htmlWebpackPlugin.options.title in vue cli 3 project?

  • Faziki
    Faziki over 3 years
    Above answer works perfectly, just remember to restart your npm or yarn
  • mayank1513
    mayank1513 over 3 years
    package.json does not support non-url-compatible name
  • MAW
    MAW over 3 years
    That's true. I'm updating the answer to show more options.
  • jean d'arme
    jean d'arme about 3 years
    Why just not add <title></title> tag in index.html?
  • Can PERK
    Can PERK almost 3 years
    @jeand'arme it is related SPA logic. On each route changed, title is considered to be changed
  • luc122c
    luc122c over 2 years
    This is an absolutely phenomenal answer. 👏
  • Jose
    Jose over 2 years
    Tks!! Great answer!
  • cdsaenz
    cdsaenz over 2 years
    Vue Meta is awesome, perfect solution for me!
  • Ursidours
    Ursidours over 2 years
    For some reason, none of the above solutions seemed to work on my Vue 3 / Vue CLI 4 project. In the end I was able to update the title, as well as the other meta info, using @vueuse/head