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


79

在将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


看来他们改用打字稿2.0了
内森·史密斯


感谢您的链接,但这不是我想要的。那是为了添加定义文件。我正在尝试找出将第三方JavaScript库包含到我的项目中的正确方法。
克里斯·霍伦贝克

Webpack angular2示例如何为供应商捆绑不同的捆绑包,为多态性捆绑捆绑,为应用程序捆绑捆绑包,为CSS捆绑捆绑捆绑包,以保持应用整洁。
乔拉瓦·辛格

Answers:


90

上次使用angular-cli 7.xx和Angular 7.xx进行测试

可以使用scripts:[]in来完成.angular-cli.json

{
  "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
  }
}

注意:正如文档在全局库安装中所建议的那样:如果您更改styles(或scripts!)属性的值,则:

如果正在运行,请重新启动服务,

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

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


4
将脚本添加到angular-cli.json后,如何在Typescript中引用jquery?
nthaxis

1
顺便说一句,如果要添加的外部文件是polyfill,那么有一个专用的机制可以很好地描述于src/polyfills.ts(从beta.31开始)
rmag

3
如果您在Angular项目中使用jQuery,那么您做错了。我喜欢jQuery,这使我的职业生涯走了很多步,但是如果您正确使用Angular,就不再需要jQuery。
布莱尔·康诺利

5
@BlairConnolly,虽然我同意,但我们希望摆脱jQuery。我们正在使用公司内另一个团队的Jquery UI,该团队目前没有时间重写整个UI。所以有时候人们只是别无选择。
Kris Hollenbeck

1
有写的东西在这里暗示>一旦你通过脚本阵列导入库,你不应该通过import语句在你的打字稿代码导入(如进口*为$从“jQuery的”;)
PaulCo

21

使用scripts:[]then向<head>with添加一些东西有细微的区别<script>scripts:[]从中添加的脚本scripts.bundle.js始终会被加载到body标签中,因此将在中的AFTER脚本中加载<head>。因此,如果脚本加载顺序很重要(即,您需要加载全局polyfill),那么您唯一的选择是手动将脚本复制到文件夹(例如,使用npm脚本),然后将此文件夹作为资产添加到中.angular-cli.json

因此,如果您真的依赖于angular本身之前加载的东西(选项A),那么您需要将其手动复制到角度构建中将包含的文件夹中,然后可以使用<script>in手动加载它<head>

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

  • 在以下位置创建一个vendor文件夹src/
  • 将此文件夹作为资产添加到.angular-cli.json
"assets": [
    "assets",
    "favicon.ico",
     "vendor"
  ]
  • 将您的供应商脚本复制node_modules/some_package/somejs.jsvendor

  • 手动将其加载到index.html<head> <script src="vendor/some_package/somejs.js"> </head>

然而,你只需要用这种方法来包装大部分时间,需要进行全球上市,之前的一切(即某些polyfills)。Kris的答案对选项B成立,您将从webpack的构建中受益(缩小,哈希等等)。

但是,如果您的脚本不需要在全球范围内可用,并且它们已经准备好用于模块,则可以将其导入,src/polyfills.ts甚至更好地仅在特定组件中需要它们时才导入它们。

通过scripts:[]或手动加载脚本使脚本在全局范围内可用会带来一系列问题,并且仅在绝对必要时才应使用。


这很棒,因为我可以为每个环境创建一个js配置文件,将它们保留在那里并在运行时加载它们,而不是使用environment.ts文件,而不必为每个环境构建角度文件(糟糕……)
Erik Philips

您是否有使用填充或加载特定组件的示例?
Steve Lam

@SteveLam请更具体或提出一个新问题。通常,polyfill不会加载到特定的组件中,而是全局加载,除非您希望组件是独立的,但是即使那样,它还是希望定义期望的运行时环境,并让组件的使用者决定何时以及如何加载一个polyfill。
Christian Ulbrich

感谢克里斯,您是否有任何有关此的文章?
史蒂夫·林

嗨,我使用angular 7,当我运行mi app时,该脚本已加载到索引页面中,但我需要在其他页面中使用该脚本,当我单击其他页面时,该脚本已卸载,我如何在特定页面上加载该脚本或整个应用程序?
路易斯·阿尔贝托·华雷斯

3

您需要打开文件.angular-cli.json文件并需要搜索, "scripts:"或者如果要添加外部CSS,则需要"styles":在同一文件中找到单词。

如下面所示的示例,您将看到引导Js(bootstrap.min.js)和引导CSS(bootstrap.min.css)如何包含在.angular-cli.json

"styles": [
    "styles.css",
    "../node_modules/bootstrap/dist/css/bootstrap.min.css"
  ],
  "scripts": [
    "../node_modules/jquery/dist/jquery.min.js",
    "../node_modules/bootstrap/dist/js/bootstrap.min.js"
  ],

如果您有自己的js文件,可以确保将文件路径添加 .angular-cli.json到同一位置"scripts":[]


2

您可能需要看看此页面:https : //github.com/angular/angular-cli#global-library-installation

它显示了如何包括.js和.css文件的基础

需要将一些javascript库添加到全局作用域,并像在script标记中一样加载它们。我们可以使用angular-cli.json的apps [0] .scripts和apps [0] .styles属性进行此操作。


7
不鼓励仅链接的答案。请在参考链接中引用答案的重要部分,因为如果链接页面发生更改,答案可能会失效。
Stuart Siegler

-1

我以前没有使用过angular-cli,但目前正在使用Angular / Webpack构建。为了向我的应用程序提供jQuery和其他供应商,我使用webpack的插件ProvidePlugin()。这通常位于您的webpack.config.js:这是jquery,lodash和moment库的示例。这是文档的链接(充其量是含糊的)

plugins: [
  new webpack.ProvidePlugin({
    $: 'jquery',
    _: 'lodash',
    moment: 'moment',
  })
]

令人难以置信的是,只要所有其他Webpack设置均已正确完成并已安装,它实际上允许您立即使用它npm


1
角度cli Webpack配置实际上是角度cli节点程序包的一部分。因此,不幸的是我无法修改它。例如,在CLI中,有一些预设命令可以构建。ng build这全部由cli处理。但是我当时在想,可能有一种方法可以在构建过程中添加一些东西。但是我还没有看到任何明确的例子。
克里斯·霍伦贝克

抱歉!我过滤了有角度的2个问题,但这个问题没有解决。祝你好运。
zilj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.