Vue:在组件中使用自定义库(pdf.js)

时间:2017-10-05 06:33:29

标签: javascript vue.js pdfjs

如何在Vue组件中使用供应商库(特别是我想使用PDF.js)? (我只想为这个特定的组件加载它,因为它们是相当大的文件)

我正在构建一个需要加载pdf的编辑器。所以我将pdf.js和pdf.worker.js放在/ src / assets / vendor / pdfjs中

然后我在template-editor-page.hbs中同时加载组件:

<div class="content">
  <div class="row fill">
    <div class="col-md-2 fill br pt30">
    </div>
    <div class="col-md-10 fill pt30 pl30 pr30">
      <div id="template-editor" class="template-editor">  
        <template-editor template-src="{{template.src}}"></template-editor>    
      </div>
    </div>
  </div>
</div>
<script src="/assets/js/template-editor.bundle.js"></script>
<script src="/assets/vendor/pdfjs/pdf.js"></script>
<script src="/assets/vendor/pdfjs/pdf.worker.js"></script>

我的template-editor.js(我必须在这里加载吗?):

import Vue from 'vue';
import templateEditor from './components/template-editor.vue';

new Vue({
  el: '#template-editor',
  components: { templateEditor }
});

现在我想在template-editor.vue中加载文件:

<template>
    <!-- ... -->
</template>

<script>

  export default {
    props: ['templateSrc'],
    name: 'template-editor',
    data() {
      return {
        src: this.templateSrc
      };
    },
    methods: {
      render() {
        PDFJS.getDocument(this.$data.src).then(function(pdf) {
          console.log(pdf);
        }, err => console.log(err));
      }
    },
    created: function() {
      this.render();
    }
  };
</script>

但我收到错误

ReferenceError: PDFJS is not defined

其他一切似乎都很好。我错过了什么?

3 个答案:

答案 0 :(得分:1)

而不是供应商脚本的script标签,最好使用webpacks动态导入功能(https://webpack.js.org/guides/code-splitting/#dynamic-imports)在您的渲染功能中加载此供应商库:

render() {
    import('/assets/vendor/pdfjs/pdf.js').then(PDFJS => {
        PDFJS.getDocument(this.$data.src).then(function(pdf) {
          console.log(pdf);
        }, err => console.log(err));
    }
}

要让import工作,您还必须安装此babel插件http://babeljs.io/docs/plugins/syntax-dynamic-import/

答案 1 :(得分:1)

我认为缺少的只是组件中的import语句,

<强> CORRECTION 试试&#39; @&#39;在下面的导入位置。我忘了,你的组件可能在&#39; src&#39;的子文件夹中。另请参阅下面有关pdfjs-dist。

的说明
<script>
  import { PDFJS } from '@/assets/vendor/pdfjs/pdf.js'

  export default {
    props: ['templateSrc'],
    name: 'template-editor',
    ...

替代

由于您拥有webpack,因此最好将pdfjs-dist安装到节点模块中(请参阅pdfjs-dist),然后将其从&#39; ./ assets / vendor / pdfjs / pdj.js&#39中删除;

npm install pdfjs-dist

如果您这样做,则导入更符合标准&#39;

import { PDFJS } from 'pdfjs-dist'

答案 2 :(得分:-1)

感谢您的帮助。事实证明,答案隐藏在第一个片段中:我在捆绑后导入pdfjs。但由于捆绑需要它,我需要在以前导入它:

<script src="/assets/vendor/pdfjs/pdf.js"></script>
<script src="/assets/vendor/pdfjs/pdf.worker.js"></script>
<script src="/assets/js/template-editor.bundle.js"></script>

毕竟真的不是那么复杂;)