[Solved] How to Make Webpack work with .vue files?

Following this
meteor-webpack

And the error shows up when run meteor

W20200621-11:40:32.093(8)? (STDERR)     ERROR in ./src/imports/ui/pages/Auth/VerifyEmail.vue 1:0
W20200621-11:40:32.093(8)? (STDERR)     Module parse failed: Unexpected token (1:0)
W20200621-11:40:32.093(8)? (STDERR)     You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
W20200621-11:40:32.093(8)? (STDERR)     > <template>
W20200621-11:40:32.093(8)? (STDERR)     | <div class="container"> 
W20200621-11:40:32.094(8)? (STDERR)     |         <div v-if="error" class="alert alert-danger" role="alert">
W20200621-11:40:32.094(8)? (STDERR)      @ ./src/imports/routes.js 46:0-57 194:19-30
W20200621-11:40:32.094(8)? (STDERR)      @ ./src/imports/app.js
W20200621-11:40:32.094(8)? (STDERR)      @ ./src/imports/server.js
W20200621-11:40:32.094(8)? (STDERR)      @ ./startup/server/init.js
W20200621-11:40:32.094(8)? (STDERR)     
W20200621-11:40:32.095(8)? (STDERR)     ERROR in ./src/imports/ui/pages/Auth/Profile.vue 1:0
W20200621-11:40:32.095(8)? (STDERR)     Module parse failed: Unexpected token (1:0)
W20200621-11:40:32.095(8)? (STDERR)     You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
W20200621-11:40:32.095(8)? (STDERR)     > <template>
W20200621-11:40:32.095(8)? (STDERR)     | <div v-if="!userVerified" class="container">

All the place are this type of error!
I have double checked and no Upper case of Vue
The VerifyEmail.vue is:

<template>
<div class="container"> 
        <div v-if="error" class="alert alert-danger" role="alert">
             <h4 class="alert-heading">{{ error }}</h4>
          </div>

            <ZoomCenterTransition>
            <div v-if='success' class="alert alert-success" role="alert">
              <h4 class="alert-heading">Verify Success!</h4>
              <p>Redirecting...</p>
            </div>
        </ZoomCenterTransition>
</div>
</template>
<script>
    import {mapActions} from 'vuex'

export default {
     data(){
     return {
        isLoading: true,
        success:undefined,
        error: undefined,
     }
   },
   async created(){
        let token = this.$route.params.token;
            console.log('created token',token)
         const {error, result} = await this.verifyEmail({token});
         console.log('created token',error,result)
         if(error){
            this.error = error
         }else{
             this.success = true;
              this.$router.replace({name:'overview'})
         }
         this.isLoading = false
    },

    methods:{
        ...mapActions(['verifyEmail'])
    }
}
</script>

package.json

"dependencies": {
        "@babel/runtime": "^7.4.4",
        "babel-core": "^6.26.3",
        "babel-loader": "^8.1.0",
        "babel-preset-env": "^1.7.0",
        "babel-preset-stage-2": "^6.24.1",
        "babel-preset-stage-3": "^6.24.1",
        "babel-preset-vue": "^2.0.2",
        "babel-runtime": "^6.26.0",
        "bcrypt": "^3.0.8",
        "bluebird": "^3.7.2",
        "body-parser": "^1.19.0",
        "bootstrap": "^4.4.1",
        "bootswatch": "^4.5.0",
        "bottleneck": "^2.19.5",
        "brotli": "^1.3.2",
        "cli-progress": "^3.8.2",
        "compression": "^1.7.4",
        "cookie-parser": "^1.4.5",
        "core-js": "^3.0.1",
        "cross-env": "^7.0.2",
        "crypto-js": "^4.0.0",
        "css-loader": "^3.6.0",
        "express": "^4.17.1",
        "file-loader": "^6.0.0",
        "form-data": "^3.0.0",
        "handbrake-js": "^5.0.0",
        "hooper": "^0.3.4",
        "html-minifier": "^4.0.0",
        "html-webpack-plugin": "^4.3.0",
        "intersection-observer": "^0.6.0",
        "lodash": "^4.17.15",
        "lru-cache": "^5.1.1",
        "marker-clusterer-plus": "^2.1.4",
        "meteor-node-stubs": "^0.4.1",
        "moment-timezone": "file:../Replacing node_module files/moment-timezone-develop",
        "node-fetch": "^2.6.0",
        "node-sass": "^4.14.1",
        "postscribe": "^2.0.8",
        "prerender-node": "^3.2.5",
        "request": "^2.88.2",
        "request-promise": "^4.2.5",
        "rss-parser": "^3.8.0",
        "sass-loader": "^8.0.2",
        "segfault-handler": "^1.3.0",
        "simpl-schema": "^1.5.7",
        "string-score": "^1.0.1",
        "torrent-stream": "^1.2.0",
        "uuid": "^7.0.2",
        "v-lazy-image": "^1.4.0",
        "vue": "2.6.11",
        "vue-analytics": "^5.22.1",
        "vue-disqus": "^3.0.5",
        "vue-dragscroll": "^2.1.0",
        "vue-js-modal": "^2.0.0-rc.3",
        "vue-loader": "^15.9.2",
        "vue-meta": "^2.3.3",
        "vue-meteor-tracker": "^2.0.0-beta.4",
        "vue-observe-visibility": "^0.4.4",
        "vue-router": "^3.0.6",
        "vue-server-renderer": "2.6.11",
        "vue-social-sharing": "^2.4.7",
        "vue-style-loader": "^4.1.2",
        "vue-template-compiler": "^2.6.11",
        "vue-toast-notification": "^0.2.0",
        "vue2-transitions": "^0.3.0",
        "vuex": "^3.1.1",
        "vuex-router-sync": "^5.0.0",
        "webpack": "^4.43.0",
        "webpack-dev-middleware": "^3.7.2",
        "webpack-hot-middleware": "^2.25.0",
        "webpack-meteor-externals": "0.0.5",
        "webpack-node-externals": "^1.7.2",
        "webtorrent": "file:../Replacing node_module files/webtorrent"
    },
    "devDependencies": {
        "@fortawesome/fontawesome-free": "^5.13.0",
        "babel-helper-vue-jsx-merge-props": "^2.0.3",
        "babel-plugin-syntax-jsx": "^6.18.0",
        "babel-plugin-transform-vue-jsx": "^3.7.0"
    }

meteor packages:

ostrio:cookies

meteor-base@1.4.0             # Packages every Meteor app needs to have
mobile-experience@1.1.0       # Packages for a great mobile UX
mongo@1.10.0                   # The database Meteor supports right now
tracker@1.2.0                 # Meteor's client-side reactive programming library


shell-server@0.5.0            # Server-side component of the `meteor shell` command

accounts-password@1.6.0

schema-index

browser-policy@1.1.0
littledata:synced-cron
reywood:publish-composite


underscore@1.0.10
fourseven:scss
cdn
dburles:collection-helpers
natestrauser:publish-performant-counts
force-ssl@1.1.0
accounts-google@1.3.3
accounts-facebook@1.3.2
service-configuration@1.0.11
alanning:roles

fortawesome:fontawesome

routepolicy@1.1.0
ostrio:meteor-root
ardatan:webpack
ardatan:webpack-dev-middleware
server-render@0.3.1

I was using :package: akryum:vue-component
And i removed that after add meteor-webpack

webpack config:

var path = require('path')
var webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin');
const meteorExternals = require('webpack-meteor-externals');
const nodeExternals = require('webpack-node-externals');

const clientConfig = {
    entry: './startup/client/init.js',
    output: {
        publicPath: '/',
        filename: 'build.js'
    },
    module: {
        rules: [{
                test: /\.css$/,
                use: [
                    'vue-style-loader',
                    'css-loader'
                ],
            },
            {
                test: /\.scss$/,
                use: [
                    'vue-style-loader',
                    'css-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.vue$/,
                include: /src/,
                loader: 'vue-loader',
                options: {
                    loaders: {}
                    // other vue-loader options go here
                }
            },
            {
                test: /\.js$/,
                loader: 'babel-loader',
                exclude: /node_modules/
            },
            {
                test: /\.(png|jpg|gif|svg)$/,
                loader: 'file-loader',
                options: {
                    name: '[name].[ext]?[hash]'
                }
            }
        ]
    },
    resolve: {
        alias: {
            'vue$': 'vue/dist/vue.esm.js'
        },
        extensions: ['*', '.js', '.vue', '.json']
    },
    externals: [meteorExternals()],
    devServer: {
        historyApiFallback: true,
        noInfo: true,
        overlay: true,
        hot: true
    },
    performance: {
        hints: false
    },
    devtool: '#eval-source-map',
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new HtmlWebpackPlugin({
            template: './client/index.html'
        })
    ]
}

const serverConfig = {
    entry: './startup/server/init.js',
    target: 'node',
    externals: [meteorExternals(), nodeExternals()],
    devServer: {
        hot: true
    },
};

module.exports = [clientConfig, serverConfig];

/startup/client/init.js

import { Cookies } from 'meteor/ostrio:cookies';
import '../../src/imports/client'


cookies = new Cookies();

// Chrome 1 - 79
window.isChrome = function() {
    return navigator.userAgent.indexOf("Chrome") > -1;
}

client.js

import 'intersection-observer'
import { Meteor } from 'meteor/meteor'
import CreateApp from './app'
import Vue from 'vue'
import './lib/init'

// import { onPageLoad } from "meteor/server-render";
import VueAnalytics from 'vue-analytics'
import VueDisqus from 'vue-disqus'
import { SlideYDownTransition, SlideXRightTransition, SlideYUpTransition, CollapseTransition, ZoomXTransition, ZoomCenterTransition } from 'vue2-transitions'

import VueToast from 'vue-toast-notification';
// Import any of available themes
import 'vue-toast-notification/dist/theme-default.css';
//import 'vue-toast-notification/dist/theme-sugar.css';
import VModal from 'vue-js-modal'
import 'hooper/dist/hooper.css';

// const subsCache = new SubsCache({
//     expireAfter: 5,
//     cacheLimit: 20
// })
// Vue.prototype.$subsCache = subsCache;
const SocialSharing = require('vue-social-sharing');

Meteor.startup(() => {
    // console.log('initalize cookies', cookies)
    // setTimeout(() => {
    const { app, store, router } = CreateApp({ // Same function as the server
        ssr: false,
    });
    // Hydrate the Vuex store with the JSON string
    if (window._VUE_APP_) {
        store.replaceState(window._VUE_APP_);
    } 

    app.$mount('#app');

    Vue.component('SlideYDownTransition', SlideYDownTransition)
    Vue.component('SlideXRightTransition', SlideXRightTransition)
    Vue.component('SlideYUpTransition', SlideYUpTransition)
    Vue.component('ZoomXTransition', ZoomXTransition)
    Vue.component('CollapseTransition', CollapseTransition)
    Vue.component('ZoomCenterTransition', ZoomCenterTransition)



    Vue.use(VueDisqus)
    Vue.use(SocialSharing);
    Vue.use(VModal)
    Vue.use(VueToast, {
            // One of options
            position: 'top'
        })
})

// onPageLoad(async sink => {
//     console.log('onPageLoad')

.babelrc

{
  "presets": [
    "env",
    "vue",
    "stage-2"
  ],
  "plugins": [
    "transform-vue-jsx"
  ]
}

.meteorignore
* !.meteor/ !node_modules/ !webpack.config.js

.vueignore

node_modules/

This problem was solved by reducing the vue-loader’s version to 14

1 Like