用Webpack编译时Vue用注释替换HTML

Mic*_*ael 9 javascript webpack vue.js

我面临的问题是,一旦我importvue,vue(在我的情况下#app)的wrapper元素将被以下注释替换

<!--function (e,n,r,o){return sn(t,e,n,r,o,!0)}-->
Run Code Online (Sandbox Code Playgroud)

控制台中没有错误,并且webpack可以正常编译,但是我确实从vue的mounted方法获取了控制台日志。

我的index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <h1>some content</h1>
        {{test}}
    </div>
    <script src="dist/bundle.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

webpack.config.js

const path = require('path');

module.exports = {
    entry: './src/app.js',
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    }
}
Run Code Online (Sandbox Code Playgroud)

src / app.js

import Vue from 'vue'

const app = new Vue({
    el: "#app",
    data: {
        test: "asdf"
    },
    mounted() {
        console.log('mounted')
    }
})
Run Code Online (Sandbox Code Playgroud)

小智 7

您正在运行没有模板编译器的仅运行时生成。

查看https://vuejs.org/v2/guide/installation.html#Webpack

您需要为'vue'创建别名,因此webpack包含来自node_modules /的正确的vue / dist / *。js:

module.exports = {
  // ...
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅https://forum.vuejs.org/t/what-is-the-compiler-included-build/13239


Sea*_*her 6

虽然 Leonie 的答案是功能性的,但生产构建通常不需要包含模板编译器。我会说这可能是不受欢迎的,因为动态构建模板可能会对性能产生影响,我认为本答案就是这种情况。此外,看起来 Leonie 的答案在生产版本中包含了 Vue 的完整开发版本,由于此版本中包含所有额外内容,因此不鼓励这样做。相反,可以在构建步骤中预编译模板

执行此操作的最简单方法是使用单文件组件 (SFC),如上一个链接中所述:

[该] 关联的构建设置会自动为您执行预编译,因此构建的代码包含已编译的渲染函数而不是原始模板字符串。

我需要针对我自己的情况使用的另一种方法rendertemplate为组件定义定义一个显式函数而不是 a ,因此不需要编译。我需要这个是因为我当时生成的 Vue 项目对其所有组件都使用了 SFC,除了根“安装”组件,它是使用以下对象显式定义的:

new Vue({
  el: '#app',
  store,
  router,
  components: { App },
  template: '<App />'
})
Run Code Online (Sandbox Code Playgroud)

这在开发模式下运行良好,但在生产中因您遇到的“功能注释”问题而失败。从 Leonie 的回答中汲取见解,我将上面的代码片段替换为以下内容:

new Vue({
  el: '#app',
  store,
  router,
  components: { App },
  render: (h) => {
    return h(App)
  }
})
Run Code Online (Sandbox Code Playgroud)

这解决了我的生产版本的问题,而无需我包含 Vue 的完整开发版本。

  • 以上是对我有帮助的答案。我将所有单文件组件与 webpack/vue-cli 一起使用,并且所有内容都很好地隔离,但是当我添加 vue-router 时,我心不在焉地按照 Vue Router 文档示例添加了 `&lt;router-link&gt;` 和 `&lt;router-view&gt; ` 直接进入我的 html `&lt;div id="app"&gt;&lt;/div&gt;` ,如上所述,它需要在运行时使用模板编译器,呃!我只是将这些路由器指令复制到一个名为 App.vue 的简单基本 SFC 中,并像 Sean 在此答案中所做的那样将其包含在内,从而允许 webpack 预编译它。非常感谢你让我发疯。 (2认同)