Vue CLI-将构建输出组合到单个html文件中

时间:2019-10-07 16:55:31

标签: javascript html vue.js webpack

我有一个用vue-cli创建的vue项目。运行yarn build时的正常输出是一个带index.html的dist文件夹以及一个带有相应的.js和.css文件的js和css子目录。

我希望构建输出是包含js和css的单个html文件。

我在项目的根目录中添加了一个vue.config.js文件,并将其设置为输出单个js文件,效果很好。但是我只想将js和任何CSS都放在一个html文件上。

module.exports = {
    css: {
        extract: false,
    },
    configureWebpack: {
      optimization: {
        splitChunks: false
      }
    }
  }

基本上,我希望我的html文件是这样的:

<html lang=en>
    <head>
        ... meta tags
        <title>my title</title>
    </head>
    <body>
        <div id=app></div>
        <script>
           // contents of the output js file here
        </script>
    </body>
</html>

这可能吗?

使用Vue 3.9.3

1 个答案:

答案 0 :(得分:2)

有人提出了建议,请他们调查html-webpack-inline-source-plugin,但删除了他们的答案。但这正是我需要完成的工作。

该插件不是Vue或Vue-CLI特有的,但是如果您执行以下操作,它将起作用:

1)在应用程序的根目录中添加一个vue.config.js文件。

2)上面链接的插件实际上是另一个软件包的扩展。你们两个都需要。

npm install --save-dev html-webpack-plugin 
npm install --save-dev html-webpack-inline-source-plugin 

3)

// vue.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
const HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin');
module.exports = {
    css: {
        extract: false,
    },
    configureWebpack: {
      optimization: {
        splitChunks: false // makes there only be 1 js file - leftover from earlier attempts but doesn't hurt
      },
      plugins: [
        new HtmlWebpackPlugin({
          filename: 'output.html', // the output file name that will be created
          template: 'src/output-template.html', // this is important - a template file to use for insertion
          inlineSource: '.(js|css)$' // embed all javascript and css inline
        }),
        new HtmlWebpackInlineSourcePlugin()
      ]
    }
  }

4)添加模板。这对于在Vue上下文中工作是必要的,因为如果没有它,默认情况下输出的html文件将没有必要的<div id="app"></div>,并且Vue无法装载到任何东西。我基本上将正常的输出html文件拿来并对其进行了一些修改。

<!-- output-template.html -->
<!DOCTYPE html>
<html lang=en>
    <head>
        <meta charset=utf-8>
        <meta http-equiv=X-UA-Compatible content="IE=edge">
        <meta name=viewport content="width=device-width,initial-scale=1">        
        <title>example title</title>
    </head>
    <body><noscript><strong>We're sorry but my example doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript>
        <div id=app>

        </div>
        <!-- plugin will insert js here by default -->
    </body>
</html>

然后像往常一样构建,output.html文件将位于/dist文件夹中