【问题标题】:Vue: use a custom libary (pdf.js) in a componentVue:在组件中使用自定义库(pdf.js)
【发布时间】:2018-03-16 16:41:16
【问题描述】:

如何在 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

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

【问题讨论】:

  • 你在使用 webpack 吗?
  • 是 module.exports = { entry: { 'template-editor': './src/views/templates/template-editor/template-editor.js'}

标签: javascript vue.js pdfjs


【解决方案1】:

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

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/

【讨论】:

  • 谢谢,我试过了。但是我收到错误“'import' 和 'export' 可能只出现在顶层”
  • 你配置 babel 在 webpack 中进行转译了吗?
  • 不确定。我没有做初始设置。虽然看起来像
  • 好的,我刚刚对我的答案进行了编辑,您还需要这个 babel 插件才能导入工作。
  • 错误:未指定“GlobalWorkerOptions.workerSrc”。
【解决方案2】:

我认为你的组件中缺少的只是导入语句,

更正 尝试在下面的导入位置使用“@”。我忘记了,您的组件可能位于“src”的子文件夹中。另请参阅下面有关 pdfjs-dist 的注释。

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

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

替代方案

既然你有 webpack,你最好将 pdfjs-dist 安装到节点模块中(参见 pdfjs-dist),然后从 './assets/vendor/pdfjs/pdj.js' 中删除它

npm install pdfjs-dist

如果这样做,导入更“标准”,

import { PDFJS } from 'pdfjs-dist'

【讨论】:

  • 是的,我想我一直在尝试。再打一次。它说:“找不到模块”。/assets/vendor/pdfjs/pdf.js“有或没有'。'顺便说一句。
  • 好的,我注意到一个 npm 包可能会做你想做的事 - 即将发布编辑。
  • 所以我试过了,但现在找不到一些包(404):GET localhost:3000/templates/2878d994-4f58-40e8-b9d6-405733f400c1/… net::ERR_ABORTED
  • 看起来像一个不同的问题。顺便说一句,您选择了哪个更改 - 从 '@/assets/...' 导入或安装 pdfjs-dist?
【解决方案3】:

感谢你们的帮助。原来答案隐藏在第一个 sn-p 中:我在包之后导入 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>

毕竟真的没那么复杂;)

【讨论】:

  • 你不应该使用&lt;script src="/assets/vendor/pdfjs/pdf.worker.js"&gt;&lt;/script&gt;
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 2018-12-04
  • 2018-12-10
  • 2021-07-26
  • 2019-09-04
  • 2020-09-08
  • 2019-01-03
  • 2019-11-16
相关资源
最近更新 更多