当我需要一个文件夹并且这似乎不可能时,如何使用 require 安装 SDK?

how do I install an SDK using require, when I need to require an folder and this seems impossible?

问题描述。 我正在尝试关注 https://github.com/lucascosta/facebook-js-ads-sdk to install the Javascript SDK for Facebook. Before anyone objects, I am absolutely aware of the compact version (https://developers.facebook.com/docs/javascript/quickstart),但是 API 对我来说绝对没用。我需要 Lucas Costa 制作的那个,以便能够更改我的广告帐户,Facebook 推荐的脚本无法启用。

像往常一样,安装说明(参见 github.com/lucascosta/facebook-js-ads-sdk)可怕地基于我不知道的神秘条件。我无法让 SDK 工作,希望有人明确告诉我该做什么。问题的症结在于自相矛盾的情况:我应该使用 require('...') 命令(在哪里??)来包含 SDK(这应该保存在哪里??)却需要 不能 用于文件夹,但用于脚本。也许某处有一个 require.config 文件,我应该设置它,但我不知道,就像我说的那样,这些说明完全绕过了任何必要的启动条件。​​

这是我到目前为止所做的。我的 folder-structure 看起来像这样(我什至不知道这是否正确,正如 no-one 在任何地方解释的那样!):

[Serverroot]
  — [folder with my website]
      – facebook-ads-sdk (the folder one gets by downloading)
      – css — pagestyles.css
      – js — lib
              require.js
           — app
              ( some header scripts )
      – img
              ( some images )
      index.php

index.php 中,我有一段 html,然后是一些 javascript。正是在这里,我尝试从 .浏览器甚至无法通过 const adsSdk = require('facebook-ads-sdk'); 行。我尝试了很多方法:require('./facebook-ads-sdk');,将所有这些移动到脚本 main.js 中的文件夹 ./js/app,然后在 index.php 中写入我的 html,其中mainrequire 位于。设置 require.config(或 requirejs.config)用 requirejs 替换 require 等,并在 index.php<head> 部分包含适当的脚本.没有任何帮助。以下是错误:首先使用 const adsSdk = require('facebook-ads-sdk'); 我得到

Error: Module name "facebook-ads-sdk" has not been loaded yet for context: _. Use require([])

好的。我如何“为上下文加载模块”?阅读 requirejs.org/docs/start.html 在这里没有帮助。我试过 require([], function() {require('facebook-ads-sdk')}); 同样的错误。我试过了 require(['facebook-ads-sdk']);

我尝试在 index.php 的脚本中使用以下命令:

require.config({
    shim: {
        'facebook': {
            exports: 'adsSdk',
        },
    },
    paths: {
        'sdk': './facebook-ads-sdk',
    }
});
var adsSdk = require(['sdk']);

然后我得到错误

Failed to load resource: http:// .... /facebook-ads-sdk.js the server responded with a status of 404 (Not Found)

,浏览器认为我试图包含一个脚本 facebook-ads-sdk.js,但我应该(???)“要求”整个文件夹!到底是怎么回事? 谁能给我关于必要的文件夹结构和命令的详细说明,以便让这个 SDK 正常工作?

为什么网上对这件事的描述如此含糊不清?有没有什么神秘的SDK安装方式,“人尽皆知”,却从未提及?


更新:解决方案。对于任何未来google-searches同样的问题:通过以下简单的方法,可以安装和嵌入Javascript-FB-Ads-SDK:

  1. 通过 npm install --save facebook-ads-sdk npm 模块 Lucas Costa 的 facebook-ads SDK 的副本安装。
  2. 将此文件夹复制到您网站的架构中(实际上您可能只需要一个子文件夹/文件)。
  3. 在您的 HTML 中包含脚本(通过 <script type='text/javascript' src='...'></script>),其中 src 指向 facebook-ads-sdk 文件夹中的文件:/dist/iife.js.
  4. 在您页面的脚本中,您现在可以通过全局变量 fb.
  5. 访问 API

替代 3:

3'。在您的 HTML headers 中确保通过 <script> 标签包含 require.js 脚本。然后在您网站的 javascript 的任意位置应用以下命令:

require.config({
    paths: {
        'sdk': './[FOLDERNAME OF SDK]/dist/iife',
    }
});
require(['sdk']);

感谢并特别感谢 @SLaks@KhauriMcClain(如果可以的话,我会给你 up-points)对于此解决方案。

您需要更改使用 require 的方式。

  1. 之前没有加载过的依赖不能使用同步require方式加载。因此 const adsSdk = require('facebook-ads-sdk'); 将不起作用。您将需要使用 require(['name-of-script'], callback).
  2. 形式
  3. Require 不允许您加载整个文件夹。您必须找到您尝试使用的确切脚本,因此 var adsSdk = require(['sdk']); 将不起作用。

最终您的代码应该类似于:

require(['some-facebook-script'], function(someFacebookScript) { // Do some work here });

传递给回调函数的参数将是您尝试使用的已加载模块。使用异步版本时(正如我刚刚演示的那样),require 中的 return 没有用。

这些说明假设您使用的是 Webpack 或 Browserify 等捆绑系统。
如果是,说明"just work";你可以 require() 它,一切都会正常。

如果您要构建一个重要的代码库,您确实应该使用这样的系统。

如果不是,您可以在 <script> 标记中引用 iife.js,这将创建全局变量。