如何在没有 NPM 或 Webpack 的情况下将 CDN 包含到 VueJS CLI?

新手上路,请多包涵

我是 VueJS 和 Webpack 的新手。我已经使用 VueJS CLI 创建了一个项目并尝试使用它。我需要在我的代码中插入 CDN。

在使用标准 HTML、CSS 和 JS 解决方案时,我会包含这样的 CDN:

 <!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>False Merge</title>

    <!-- CDN -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/dt-1.10.16/sl-1.2.5/datatables.min.css"/>

    <!-- StyleSheets -->
    <link rel="stylesheet" href="public/stylesheets/index.css" />
</head>

<body>

    <script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=" crossorigin="anonymous"></script>
    <script type="text/javascript" src="https://cdn.datatables.net/v/dt/dt-1.10.16/sl-1.2.5/datatables.min.js"></script>

    <script src="public/javascripts/index.js"></script>

</body>

</html>

如您所见,您可以添加一个带有 HTML script 标签的 CDN 脚本,并开始在 JS 中使用它。

我正在尝试对组件中的 VueJS 做同样的事情。我已经准备好模板和样式部分。

不幸的是,我不知道如何以简单的方式添加 CDN,以便在 Vue 组件的脚本标签中立即使用。我试图这样做,但它不起作用。

 <template>
  <div class="index">
    <div class="container">
      <table id="table_dataset" class="display">
      </table>
    </div>
  </div>

</template>

<script type="text/javascript" src="https://cdn.datatables.net/v/dt/dt-1.10.16/sl-1.2.5/datatables.min.js"></script>
<script>
  export default {
    name: 'Index',
    data() {
      return {
      }
    }
  }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

有没有办法将 CDN(没有 Webpack 或 NPM)添加到 VueJS 组件?

原文由 Fabricio Chacon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 548
2 个回答

不幸的是,不,您 不能通过 template<script> 标签添加到特定组件。

在您的情况下,您有一些选择:

1:使用 NPM

使用 npm 正确安装依赖项

  • 优点: 正确使用 NPM 和 Webpack;范围定义;

  • 缺点: 脚本必须以 NPM 包的形式提供。

  • 注意:如果可用,这是 推荐 的方法。

  • 脚步:

     npm install --save datatables.net-dt
    
    
    
    • 在你的 .vue 文件中:
     <script>
      require( 'datatables.net-dt' )();
      export default {
        name: 'Index',
        data() {
          return {
          }
        }
      }
    </script>
    
    
    

2:添加 <script> 标签到 index.html

找到并添加 <script> 标签到您的 index.html

  • 优点: <script> 标签被清楚地(并且以声明方式)添加到 HTML 源代码中。该脚本只会加载一次。
  • 缺点: 脚本将被全局加载。
  • 脚步:
    • 只需将 <script type="text/javascript" src="https://cdn.datatables.net/v/dt/dt-1.10.16/sl-1.2.5/datatables.min.js"></script> 添加到 index.html 文件的末尾,最好在 </body> 之前。

3:以编程方式创建 <script> 标签

另一种选择是在组件加载时以编程方式在组件上创建 script 标记。

  • 优点: 代码仅保留在组件中。只有在加载组件时才会加载您的外部脚本。
  • 缺点: 脚本在加载后仍将是全局可用的。
  • 步骤/代码:
   <script>
    export default {
      name: 'Index',
      data() {
        return {
        }
      },
      mounted() {
        if (document.getElementById('my-datatable')) return; // was already loaded
        var scriptTag = document.createElement("script");
        scriptTag.src = "https://cdn.datatables.net/v/dt/dt-1.10.16/sl-1.2.5/datatables.min.js";
        scriptTag.id = "my-datatable";
        document.getElementsByTagName('head')[0].appendChild(scriptTag);
      }
    }
  </script>

原文由 acdcjunior 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不知道这是否仍然是一个问题,但你也可以看看 vue-meta。我正在使用它来创建更好的 SEO 实现,但使用它,您可以包含特定组件的 CSS 和/或 JS 文件。如果需要,您甚至可以将单个文件设置为预加载。这里有一篇不错的文案。 https://alligator.io/vuejs/vue-seo-tips/

里面说 vue-meta 不稳定,但是这篇文章写于 2018 年 2 月,截至今天的版本是 2.2.1。

  1. 将此行添加到依赖项对象中的 package.json 文件: "vue-meta": "^2.2.1",

注意 - 如果要成为依赖项对象的最后一行,则省略尾随逗号

  1. 打开一个终端并 cd 到包含上述 package.json 文件的目录。 (顺便说一句,如果您使用 vue ui,这一切都非常简单)。
  2. 在终端运行: npm install

然后将以下内容添加到您的 main.js 文件中。

 import Meta from "vue-meta";
Vue.use(Meta);

现在您可以自由加载静态 CSS/JS 资产。这适用于本地或来自 cdn。下面是我的例子。 忽略我的导入、组件和方法……它们与 vue-meta 无关,可能与您的不同。我只是想向您展示一个工作版本。

 <script>
import { page } from "vue-analytics";
import Header from "@/components/Header.vue";
import Footer from "@/components/Footer.vue";
export default {
  components: {
    Header,
    Footer
  },
  data: function() {
    return {};
  },
  methods: {
    track() {
      page("/");
    }
  },
  metaInfo: {
    link: [
      {
        rel: "preload",
        as: "style",
        href: "https://cdn.jsdelivr.net/npm/bootstrap-vue@2.0.0-rc.28/dist/bootstrap-vue.min.css"
      },
      {
        rel: "preload",
        as: "style",
        href: "https://fonts.googleapis.com/css?family=Cinzel|Great+Vibes|Montserra"
      },
      {
        rel: "preload",
        as: "style",
        href: "/content/css/site.css"
      },
      {
        rel: "stylesheet",
        href:
          "https://fonts.googleapis.com/css?family=Cinzel|Great+Vibes|Montserra"
      },
      {
        rel: "stylesheet",
        href: "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css",
        integrity:
          "sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T",
        crossorigin: 'anonymous"'
      },
      {
        rel: "stylesheet",
        href: "https://cdn.jsdelivr.net/npm/bootstrap-vue@2.0.0-rc.28/dist/bootstrap-vue.min.css",
        async: true,
        defer: true
      },
      {
        rel: "stylesheet",
        href: "https://use.fontawesome.com/releases/v5.8.1/css/all.css",
        integrity:
          "sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf",
        crossorigin: 'anonymous"',
        async: true,
        defer: true
      },
      {
        rel: "stylesheet",
        href: "/content/css/site.css",
        async: true,`enter code here`
        defer: true
      },
      { rel: 'favicon', href: 'favicon.ico' }
    ],
    script: [{ src: "https://unpkg.com/axios/dist/axios.min.js", async: true, defer: true }],
  }
};
</script>

原文由 N8_ 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题