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

时间:2016-08-09 16:20:01

标签: javascript angular angular-cli

在将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 lib,它实际上没有为模块加载或打字稿设置。

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

5 个答案:

答案 0 :(得分:81)

最后使用angular-cli 7.x.x和Angular 7.x.x测试

这可以使用scripts:[]中的.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
  }
}

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

  

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

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

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

答案 1 :(得分:11)

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

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

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

  • vendor
  • 中创建src/文件夹
  • 将此文件夹作为资产添加到.angular-cli.json "assets": [ "assets", "favicon.ico", "vendor" ]

  • 将供应商脚本node_modules/some_package/somejs.js复制到vendor

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

然而,大多数情况下,您只需要这种方法用于包,需要全局可用,之前其他所有方法(即某些polyfill)。 Kris的回答适用于选项B ,您可以获得webpack构建(Minification,Hashes,...)的好处。

但是,如果您的脚本无需全局可用,并且是模块就绪,您可以在src/polyfills.ts中导入它们,或者甚至更好地导入它们你需要在特定的组件中使用它们。

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

答案 2 :(得分: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":[])添加文件路径。

答案 3 :(得分:1)

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

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

  

某些javascript库需要添加到全局范围,并加载,就像它们在脚本标记中一样。我们可以使用angular-cli.json的apps [0] .scripts和apps [0] .styles属性来做到这一点。

答案 4 :(得分:-1)

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

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

令人难以置信的是,它实际上允许您立即使用它,提供所有其他webpack设置已正确完成并已与npm一起安装。