【问题标题】:Separating script, style and template in Vue.js and Webpack在 Vue.js 和 Webpack 中分离脚本、样式和模板
【发布时间】:2017-04-28 17:27:50
【问题描述】:

我正在使用令人惊叹的 VueWebpack 创建一个大型应用程序。 我不想拥有 .vue 文件,因为我想将它们分隔为 comp.jscomp.pugcomp.styl

我的comp.js 将是:

export default {
    template: require('./comp.pug'),
    data: () => {
        return {
            compStyle: require('./comp.styl');
            message: 'Hello World!'
        }
    // ...
    },
}

我的com.pug 将是:

div#comp(v-bind:style="compStyle")
    h1.heading {{ message }}

最后我的comp.styl 将是:

.heading
    color: #6E6E6E;
    background-color: #E6E6E6
    text-align: center

乍一看,一切似乎都很好,直到我尝试使用 VueRouter,当然还有像 <router-link /><router-view /> 这样的元素!

由于我没有任何 .vue 文件,我假设在 Webpack 中使用 alias: { 'vue$': 'vue/dist/vue.common.js' } 对我没有帮助!

我该如何解决这个问题?

顺便说一句,我在控制台中遇到的错误是:

[Vue 警告]:您正在使用 Vue 的仅运行时构建,其中 模板选项不可用。预编译模板 进入渲染函数,或使用编译器包含的构建。


更新

值得一提的是,我有两个入口文件: 一个用于整个应用程序

import MainComp from './comp/main';

Vue.use(VueRouter);

new Vue(MainComp).$mount('#app');

还有一个用于组件(子组件如上):

import Router from './route';
import SubComp1 from './sub1.comp'
import SubComp2 from './sub2.comp'

export default {
  template: require('./main.pug'),
  router: Router,
  components: {
    SubComp1,
    SubComp2
  }
}

我的main.pug

div
    | here goes the views
    router-view

这是我的route.js

export const Router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '/three', component: SubComp3 },
    { path: '/Four', component: SubComp4 },
    { path: '/', redirect: '/' }
  ]
})

所以当我将alias: { 'vue$': 'vue/dist/vue.common.js' } 添加到我的 webpack 中时,错误将是别的东西:

[Vue 警告]:渲染根实例时出错

未捕获的类型错误:无法读取未定义的“匹配”属性

【问题讨论】:

    标签: javascript webpack vue.js vue-router


    【解决方案1】:

    Vue-loader.vue 文件编译成render functions,如果您不使用它们,那么您将需要使用包含模板编译器的standalone-build。据我所知,这是 runtimestandalone 构建之间的唯一区别,所以我认为没有理由将 alias 用于 standalone build 在您的情况下不起作用。

    顺便提一下,.vue 文件可以拆分为多个文件。查看this page 上的 src 导入 部分,看看它是否适合您的项目要求

    【讨论】:

    • 感谢您的回答@craig_h!现在我宁愿不要使用 src 导入,因为仍然需要添加 .vues、vue-loader 等!我已经更新了我的问题......也许你也有更新版本的答案
    【解决方案2】:

    component.vue(带有 vue-loader):

    <style src='./style.styl'></style>
    <template src='./template.pug'></template>
    

    确保 *.styl、*.pug 的加载器存在。

    更新: 我忘了,你可以这样做(没有 vue-loader): 组件.js

    import './style.styl'
    import tmpl from './template.pug' // may be it will work
    
    // if import doesn't work, then do it with string variable in this file or import
    const tmpl = `
       h1 Hello world
    `
    
    export default {
       template: tmpl,
       data() {
          return {}
       }
    }
    

    【讨论】:

    • 感谢您的回答亚历克斯!正如我还为 Carig 注释掉的那样,现在我宁愿不使用 src 导入,因为仍然需要添加 .vue 文件、vue-loader 等:)
    • 只需使用 vue-cli,忘记痛苦。命令:vue init webpack project_name。链接:github.com/vuejs/vue-cli
    • 感谢您的评论!我确实使用了vue-cli 并尝试了几乎所有的模板!他们仍然提供.vue 文件...也感谢更新的答案。这已经是我正在做的一些小改动,但仍然存在问题......决定在那里进行一些重大改动:) 再次感谢
    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 2016-04-22
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2018-10-15
    • 2021-09-17
    相关资源
    最近更新 更多