使用vue文件的babel变换进行vueify(在gulp任务中)

时间:2017-02-02 14:58:36

标签: gulp ecmascript-6 vue.js browserify vueify

固定。

解决方案是:

  1. 同时传递.transform(babelify)
  2. 确保所有.vue - 文件脚本元素都显示为<script type="text/javascript"> - 类型属性必须 自定义属性,lang属性。 。或许只是标签上的第一个,甚至是唯一的属性。
  3. 认为我的问题是我的v6中有es6。我得到了:

    [09:33:36] Starting 'public'...
    
    events.js:160
          throw er; // Unhandled 'error' event
          ^
    SyntaxError: 'import' and 'export' may appear only with 'sourceType: module'
    
    npm ERR! Windows_NT 10.0.14393
    npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "s
    tart"
    

    这个错误并没有真正告诉我它来自哪里(我的理解是它来自browserify),但是如果我将公共脚本置空,则其余的构建工作。这是脚本:

    gulp.task('public', ['public/styles'], () => {
        mkdirp.sync(dest+'/public/scripts')
        return browserify('public/scripts/demo.js')
            .transform(vueify)
        .bundle()
        .pipe(fs.createWriteStream(dest+'/public/scripts/index.js'))
    })
    

    这基本上是从readme.MD复制的,用于vueify。它的依赖public/styles肯定有效。

    所以,我想,让我们尝试手动编译它们。我确保我有babel-core和babel-preset-latest。然后:构建文件:

    .babelrc

    { "presets": ["latest"]}

    vue.config.js

    var babel = require("babel-core");
    
    module.exports = {
        customCompilers: {
        // for tags with lang="es6"
        es6: function (content, cb, compiler, filePath) {
          // content:  content extracted from lang="es6" blocks
          // cb:       the callback to call when you're done compiling
          // compiler: the vueify compiler instance
          // filePath: the path for the file being compiled
          //
          // compile some ES6... and when you're done:
          const babelified = babel.transform(content) // what to do with this funky babelified.map ?
          cb(null, babelified.code)
        }
    }
    

    这基本上直接来自readme.MD,但对于es6。

    然后我更改了我的vues以获得该标记,例如:

    <template>
        <div class="container">
            <app-header></app-header>
            <div class="row"><div class="col-xs-12">
                <transition name="slide" mode="out-in">
                    <router-view></router-view>
                </transition>
            </div></div>
        </div>
    </template>
    
    <script lang="es6">
        import Header from './Header.vue'
    
        export default {
            components: {
                appHeader: Header
            },
            created() {
                this.$store.dispatch('initClasses')
            }
        }
    </script>
    
    <style>
        body {
            padding: 5vmin;
        }
    
        .slide-enter-active { animation: slide-in 200ms ease-out forwards }
        .slide-leave-active { animation: slide-out 200ms ease-out forwards }
        @keyframes slide-in {
            from { transform: translateY(-30vmin); opacity: 0 }
            to { transform: translateY(0px); opacity: 1}
        }
        @keyframes slide-out {
            from { transform: translateY(0px); opacity: 1 }
            to { transform: translateY(-30vmin); opacity: 0}
        }
    </style>
    

    问题是,我仍然得到同样的错误。我做错了什么?

    回应中的补充

    如果我遵循以下建议,我在vue处理导入语句时会遇到错误,处理我的主js文件demo.js

    package.json的dev deps

      "devDependencies": {
        "babel": "^6.5.2",
        "babel-cli": "^6.22.2",
        "babel-plugin-syntax-async-functions": "^6.13.0",
        "babel-plugin-transform-async-to-generator": "^6.22.0",
        "babel-plugin-transform-runtime": "^6.22.0",
        "babel-preset-latest": "^6.22.0",
        "babelify": "^7.3.0",
        "browserify": "^14.0.0",
        "gulp": "^3.9.1",
        "gulp-autoprefixer": "^3.1.1",
        "gulp-babel": "^6.1.2",
        "gulp-clean": "^0.3.2",
        "gulp-clean-dest": "^0.2.0",
        "gulp-concat": "^2.6.1",
        "gulp-plumber": "^1.1.0",
        "gulp-rename": "^1.2.2",
        "gulp-rimraf": "^0.2.1",
        "gulp-sass": "^3.1.0",
        "gulp-util": "^3.0.8",
        "gulp-vueify": "0.0.3",
        "mkdirp": "^0.5.1",
        "vueify": "^9.4.0"
      },
    

    几乎固定。

    在帮助下,我得到了babelify而不是窒息。这实际上非常模糊但很简单,只需删除lang属性并将type="text/javascript"添加到每个脚本标记。 (不能只添加该类型规范,它必须是脚本元素中的第一个标记。)

    它几乎可以工作。现在我明白了:

    [14:04:32] Starting 'public'...
    events.js:160
          throw er; // Unhandled 'error' event
          ^
    
    Error: Cannot find module './vues/Home.vue' from 'C:\Users\roberto\github\cmst385-accessibility\public\scripts'
    

    那不是主要的js文件!它位于routes.js

    在主要我有:

    import App from './vues/App.vue'
    import {routes} from './routes'
    

    这两项工作

    在我的路线中:

    import Home from './vues/Home.vue';
    

    即使文件存在,这也不起作用。

    宾果

    好吧所以我实际上将文件命名为“Home..vue”:)

2 个答案:

答案 0 :(得分:3)

如果没有看到这个项目,这些东西总是很难调试,但我可以告诉你我如何设置我的,你可以检查你是否已经完成了所有这些:

首先,请确保您可以在ES6中使用gulpfile。最简单的方法是将其命名为gulpfile.babel.js。我猜你已经有了这个设置,因为你正在设法编译你的styles

现在,请确保您已安装babel-latest,我再次确定您已完成此操作:

npm install --save-dev babel-preset-latest

我实际使用的是babel-es2015-preset,因此,如果您发现latest是您的问题,只需安装即可,并将以下内容添加到.babelrc

{ 
"presets": ["es2015"]
}

现在,请确保您已安装babelify

npm install --save-dev babelify

然后将以下内容添加到package.json

  "browserify": {
    "transform": [
      "babelify",
      "vueify"
    ]
  }

这意味着您可以摆脱vue.config.js,因为browserify现在应该自动应用转换。

最后在你的gulpfile中你可以做到:

gulp.task('public', ['public/styles'], () => {
   return browserify({
            entries: 'public/scripts/demo.js',
            debug: true
        })
        .bundle()
        .pipe(source('demo.js')))
        .pipe(gulp.dest('public/scripts'));
});

我从未需要将lang属性添加到script标记中以使其正常工作。

答案 1 :(得分:1)

解决方案是:

  1. 也会传递.transform(babelify)(或者在说明中列出,并将其设置为在package.json中通过babelify)
  2. 确保所有.vue - 文件脚本元素都显示为<script type="text/javascript"> - 类型属性必须 自定义属性,lang属性。 。或许只是标签上的第一个,甚至是唯一的属性。