Tencent / kbone

一个致力于微信小程序和 Web 端同构的解决方案
Other
4.79k stars 453 forks source link

Syntax Error: SyntaxError: Unexpected token #39

Closed ly525 closed 4 years ago

ly525 commented 4 years ago

您好,请教一个问题,我的场景略微有些特殊,容我描述一下:

  1. 本地有两个项目:kbone-template-vue(kbone提供的vue 小程序模板) 和 本地的 vue-cli3 生成的项目abc-repo(jsx 语法)

  2. 我想让 vue-cli3 构建一个 library ,叫 abc-lib(本地构建为abc-lib.umd.js)

需求介绍

如果想在 kbone的项目(小程序)中通过 import abc from 'abc-lib的entry 的绝对路径的形式引入(一般为 main.js)', 在 home 页面中将其引入,并作为一个组件使用(引入本地路径的原因是,我想本地开发没有问题之后,再发布 npm 包)

我的尝试

  1. 我尝试了下,如果入口是 abc-lib-main.vue, 在 jbone的模板项目中的 home.vue 通过
    import AbcLib from '/Users/lambert/Documents/Code/abc-repo/src/abc-lib-main.vue

内容是可以正常渲染的,没有问题的,abc-lib-main.vue 内容如下:

<template>
  <div>
    render engine for app
  </div>
</template>

<script>
export default {

}
</script>
  1. 但是,如果我把上面的内容改一下,入口由 abc-lib-main.vue 改为 abc-lib-main.js, 在 kbone的模板项目中的 home.vue 通过
import AbcLib from '/Users/lambert/Documents/Code/abc-repo/src/abc-lib-main.js

就会报错了,其中 abc-lib-main.js 内容如下

<template>
  <div>
    render engine for app
  </div>
</template>

<script>
export default {

}
</script>

报错信息

94% after seal

 ERROR  Failed to compile with 1 errors                                                    1:16:28 PM

 error  in /Users/lambert/Documents/Code/abc-repo/src/abc-lib-main.js

Syntax Error: SyntaxError: Unexpected token (9:11)

   7 |   },
   8 |   render (h) {
>  9 |     return <div>render engine for app</div>
     |            ^
  10 |   }
  11 | }
  12 |

 @ ./node_modules/babel-loader/lib!./node_modules/thread-loader/dist/cjs.js!./node_modules/vue-loader/lib??vue-loader-options!./src/home/Index.vue?vue&type=script&lang=js& 39:0-109 48:12-18
 @ ./src/home/Index.vue?vue&type=script&lang=js&
 @ ./src/home/Index.vue
 @ ./src/router/index.js
 @ ./src/main.js

为何采用 jsx 的写法,而不是vue 写法: 是因为 abc-lib 采用jsx 语法已经开发比较成熟了,改起来成本略高

我尝试了改了 webpack 的js的loader 对应的配置,但仍然无法生效,还想请作者指点一下,非常感谢。

我看 .babelrc 的配置中已经包含了 babel-plugin-transform-vue-jsx 了

{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "stage-2"
  ],
  "plugins": ["transform-vue-jsx", "transform-runtime"],
  "env": {
    "test": {
      "presets": ["env", "stage-2"],
      "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"]
    }
  }
}

webpack.mp.config.js

// js
      {
        test: /\.js$/,
        use: [
          'thread-loader',
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: true,
            }
          }
        ],
        exclude: /node_modules/
      },
JuneAndGreen commented 4 years ago

你编成 web 项目的时候是否会报错呢?kbone 是不会对 js 文件里面的内容做什么处理的,只会在外面包一层 function,只要配置 loader 正确就可以(loader 配置和 web 端基本上是一样的)。