webpack处理vue中render函数内容时报错

打包组件的时候报错,提示需要别的loader来处理render函数中的内容。但是我不是很理解,我已经用了vue-loader了。。。
求大神指点。。。
报错内容:

ERROR in ./components/lib/tag/src/tag.vue?vue&type=script&lang=js& (./node_modules/vue-loader/lib??vue-loader-options!./components/lib/tag/src/tag.vue?vue&type=script&lang=js&) 41:6
Module parse failed: Unexpected token (41:6)
File was processed with these loaders:
 * ./node_modules/vue-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|     ];
|     const tagEl = (
>       <span class={classes} on-click={this.handleClick}>
|         {this.$slots.default}
|       </span>
 @ ./components/lib/tag/src/tag.vue?vue&type=script&lang=js& 1:0-124 1:140-143 1:145-266 1:145-266
 @ ./components/lib/tag/src/tag.vue
 @ ./components/lib/tag/index.js

webpack配置

const path = require('path');
const { VueLoaderPlugin } = require("vue-loader");

const glob = require("glob");
const list = {};
async function makeList(dirPath, list) {
  const files = glob.sync(`${dirPath}/**/index.js`);
  for (let file of files) {
    const component = file.split(/[/.]/)[2];
    console.log("componenet:", component);
    list[component] = `./${file}`;
  }
  console.log(list);
}
makeList("components/lib", list);

module.exports = {
  entry: list,
  mode: 'development',
  output: {
    filename: "[name].umd.js", //card.umd.js
    path: path.resolve(__dirname, 'dist'),
    library: "mui",
    libraryTarget: "commonjs2",
  },
  plugins: [
    new VueLoaderPlugin(),
    new MiniCssExtractPlugin({
        filename: 'src/[name].css',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.vue$/,
        use: ['vue-loader'],
      },
      {
        test: /\.scss$/i,
        use: ["style-loader", "css-loader", "sass-loader"],
      },
    ],
  },
};

组件代码

<script>
export default {
  name: "hc-tag",
  props: {
    text: String,
    type: {
      type: String,
      default: "primary",
    },
    size: String,
    effect: {
      type: String,
      default: "dark",
    },
    round: { type: Boolean, default: false },
  },
  computed: {
    tagSize() {
      return this.size || (this.$ELEMENT || {}).size;
    },
  },
  methods: {
    handleClose(event) {
      event.stopPropagation();
      this.$emit("close", event);
    },
    handleClick(event) {
      this.$emit("click", event);
    },
  },
  render() {
    const { type, tagSize, effect, round } = this;
    const classes = [
      "hc-tag",
      type ? `hc-tag--${type}` : "",
      effect ? `hc-tag--${effect}` : "",
      tagSize ? `hc-tag--${tagSize}` : "hc-tag--mini",
      round ? `is-round` : "",
    ];
    const tagEl = (
      <span class={classes} on-click={this.handleClick}>
        {this.$slots.default}
      </span>
    );

    return tagEl;
  },
};
</script>

依赖版本


  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.13",
    "@vue/cli-plugin-eslint": "~4.5.13",
    "@vue/cli-service": "~4.5.13",
    "babel-core": "^6.26.3",
    "babel-eslint": "^10.1.0",
    "babel-loader": "^7.1.5",
    "babel-preset-env": "^1.7.0",
    "css-loader": "^2.1.0",
    "eslint": "^6.7.2",
    "eslint-loader": "^2.0.0",
    "eslint-plugin-vue": "^6.2.2",
    "file-loader": "^1.1.11",
    "json-loader": "^0.5.7",
    "karma-sourcemap-loader": "^0.3.7",
    "mini-css-extract-plugin": "^0.4.1",
    "node-sass": "^4.14.1",
    "sass-loader": "^8.0.2",
    "style-loader": "^0.23.1",
    "url-loader": "^1.0.1",
    "vue-loader": "^15.7.0",
    "vue-template-compiler": "^2.6.11",
    "webpack-cli": "^4.6.0"
  },
阅读 2.7k
1 个回答

vue-loader默认是不支持jsx语法的,需要配置babel-loader进行转化,可参考这个
webpack vue使用jsx

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏