ChatGPT解决这个技术问题 Extra ChatGPT

Angular Cli Webpack,如何添加或捆绑外部 js 文件?

在将 Angular Cli 从 SystemJs 切换到 Webpack 后,我不确定如何包含 JS 文件(供应商)。

例如

选项 A

我有一些通过 npm 安装的 js 文件。像这样将脚本标签添加到 head 标签是行不通的。这似乎也不是最好的方法。

<head>
   <script src="node_modules/some_package/somejs.js">
</head>

//With systemJs I could do this

<head>
   <script src="vendor/some_package/somejs.js">
</head>

选项 B

将这些 js 文件包含在 webpack 包中。这似乎是它可能应该做的方式。但是我不确定如何执行此操作,因为所有 webpack 代码似乎都隐藏在 angular-cli-webpack 节点包后面。我在想也许我们可以访问另一个 webpack 配置。但我不确定,因为在创建新的 angular-cli-webpack 项目时我没有看到。

更多信息:

我试图包含的 js 文件需要在 Angular 项目之前包含。例如 jQuery 和第三方 js 库,它们并没有真正设置为模块加载或打字稿。

参考文献 https://github.com/angular/angular-cli/blob/master/WEBPACK_UPDATE.md https://github.com/angular/angular-cli/tree/webpack

似乎他们切换到 typescript 2.0
感谢您的链接,但这不是我想要的。那是为了添加定义文件。我试图弄清楚将第三方 JavaScript 库包含到我的项目中的正确方法是什么。
Webpack angular2 example 如何为供应商捆绑不同的一种,一种用于多态性,一种用于应用程序,另一种用于 css 以保持应用程序清洁。

l
littleboy

最后使用 angular-cli 11.xx 和 Angular 11.xx 进行测试

这可以使用 angular.json 中的 scripts:[] 来完成。

{
  "project": {
    "version": "1.0.0",
    "name": "my-project"
  },
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      "assets": ["assets"],
      "index": "index.html",
      "main": "main.ts",
      "polyfills": "polyfills.ts",
      "test": "test.ts",
      "tsconfig": "tsconfig.json",
      "prefix": "app",
      "mobile": false,
      "styles": [
        "styles.css"
      ],
      "scripts": [
        "../node_modules/jquery/dist/jquery.js"
      ],
      "environments": {
        "source": "environments/environment.ts",
        "dev": "environments/environment.ts",
        "prod": "environments/environment.prod.ts"
      }
    }
  ],
  "addons": [],
  "packages": [],
  "e2e": {
    "protractor": {
      "config": "./protractor.conf.js"
    }
  },
  "test": {
    "karma": {
      "config": "./karma.conf.js"
    }
  },
  "defaults": {
    "styleExt": "css",
    "prefixInterfaces": false
  }
}

注意: 作为全局库安装中的 the documentation suggests:如果您更改 styles(或 scripts!)属性的值,则:

如果您正在运行它,请重新启动 ng serve,

..通过 scripts.bundle.js 文件查看在 **globalcontext 中执行的脚本。

注意:如下评论中所述。通过 es6 imports 支持 UMD 模块的 JS 库(例如 jQuery)也可以使用 es6 导入语法导入到您的打字稿文件中。例如:import $ from 'jquery';


将脚本添加到 angular-cli.json 后,如何在 Typescript 中引用 jquery?
顺便说一句,如果要添加的外部文件是一个 polyfill,那么在 src/polyfills.ts 中有一个专门的机制(从 beta.31 开始)
如果您在 Angular 项目中使用 jQuery,那么您做错了。我喜欢 jQuery,它让我的职业生涯走得很远,但如果你正确使用 Angular,就不再需要 jQuery。
@BlairConnolly,虽然我同意并且我们很想摆脱 jQuery。我们正在使用公司内另一个团队的 Jquery UI,他们目前没有时间重写整个 UI。所以有时人们只是别无选择。
@KrisHollenbeck 我并不是想成为一个混蛋,而是认真考虑我们为采用 ES 模块而积累的工具的复杂性。从转译器、框架、加载器、包管理器、捆绑器到 CLI,我们使用极其复杂、相互依赖且通常不兼容的工具来利用模块。如果我们放弃所有的好处,我们应该不愿意这样做。这应该是万不得已的方法,但对于不理解为什么复杂性甚至存在的用户来说,这将成为事实上的,只是接受它。
E
Erik Philips

使用 scripts:[] 与使用 <script><head> 添加内容之间存在细微差别。来自 scripts:[] 的脚本被添加到始终加载到 body 标记中的 scripts.bundle.js,因此将在 <head> 中加载 AFTER 脚本。因此,如果脚本加载顺序很重要(即您需要加载全局 polyfill),那么您唯一的选择是将脚本手动复制到文件夹(例如使用 npm 脚本)并将此文件夹添加为 asset.angular-cli.json

因此,如果您真的依赖于 before angular 本身(选项 A)加载的某些内容,那么您需要手动将其复制到将包含在 angular 构建中的文件夹中,然后然后您可以使用 <head> 中的 <script> 手动加载它。

因此,要实现选项 a,您必须:

在 src/ 中创建一个供应商文件夹

将此文件夹作为资产添加到 .angular-cli.json:

"assets": [
    "assets",
    "favicon.ico",
     "vendor"
  ]

将您的供应商脚本 node_modules/some_package/somejs.js 复制到供应商

在 index.html 中手动加载它: