Angular Cli Webpack, Як додати або об’єднати зовнішні файли js?


80

Я не впевнений, як включити файли JS (постачальників) після перемикання Angular Cli з SystemJ на Webpack.

Наприклад

Варіант А

У мене є декілька файлів js, які були встановлені через npm. Додавання тегів сценарію до головного тегу, як це, не працює. Також це не здається найкращим способом.

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

Варіант Б

Включіть ці js-файли як частину набору webpack. Це схоже на те, як це, мабуть, слід робити. Однак я не впевнений, як це зробити, оскільки весь код webpack, схоже, прихований за пакетом вузла angular-cli-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 третьої сторони.
— Kris Hollenbeck,

Приклад Webpack angular2, як поєднати інший для постачальника, один для поліморфізму, один для програми та один для css, щоб підтримувати чистоту програми.
— Джоравар Сінгх

Відповіді:


90

Востаннє тестували за допомогою angular-cli 7.xx та Angular 7.xx

Це може бути досягнуто з використанням 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
  }
}

Примітка: Як пропонується документацією при встановленні глобальної бібліотеки: якщо ви зміните значення свого styles(або scripts!) Властивості, тоді:

Перезапустіть сервіс, якщо ви його запускаєте,

..бачити сценарії, що виконуються у ** глобальному контексті через scripts.bundle.jsфайл.

Примітка: Як обговорюється в коментарях нижче. JS-бібліотеки, які підтримують модулі UMD через імпорт es6, такі як jQuery, також можна імпортувати у файли машинопису за допомогою синтаксису імпорту es6. Наприклад: import $ from 'jquery';.


4
Як я можу посилатися на jquery у Typescript, як тільки я додаю сценарій до angular-cli.json?
— nthaxis

1
До речі, якщо зовнішній файл, який додається, є поліфілом, то для цього є спеціальний механізм, який було добре описано в src/polyfills.ts(станом на бета.31)
— rmag

3
Якщо ви використовуєте jQuery у своєму проекті Angular, то ви робите це неправильно. Я люблю jQuery, це зайняло мене далеко в моїй кар'єрі, але якщо ви правильно використовуєте Angular, немає потреби в jQuery.
— Блер Конноллі,

5
@BlairConnolly, Хоча я згоден, і ми хотіли б позбутися jQuery. Ми використовуємо користувальницький інтерфейс Jquery від іншої команди нашої компанії, яка на даний момент не встигає переписати весь інтерфейс. Тому іноді у людей просто немає вибору.
— Kris Hollenbeck,

1
Там що - то написано про те , що тут , що запропонувати> Після того, як ви імпортувати бібліотеку через масив сценаріїв, ви не повинні імпортувати його з допомогою оператора імпорту в коді машинопис (наприклад , імпорт * в $ від «JQuery»;)
— PaulCo

21

Існує незначна різниця у використанні, scripts:[]а потім у додаванні чогось до за <head>допомогою <script>. Скрипти з scripts:[]додаються до того, scripts.bundle.jsякий завжди завантажується в тег body і, отже, буде завантажений ПІСЛЯ сценаріїв у <head>. Таким чином , якщо порядок має значення завантаження сценарію (тобто вам необхідно завантажити глобальний polyfill), то єдиним варіантом є вручну скопіювати скрипти в папку (наприклад , за допомогою NPM сценарію) і додати цю папку в якості активу в .angular-cli.json.

Отже, якщо ви дійсно залежате від того, що щось завантажується до самого angular ( варіант A ), то вам потрібно скопіювати це вручну в папку, яка буде включена до складання angular, а потім ви можете завантажити це вручну за допомогою <script>in <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>

Однак більшу частину часу цей підхід потрібен лише для пакетів, які повинні бути доступні у всьому світі, перш ніж усе інше (тобто певні полізаповнення). Відповідь Кріса справедлива для Варіанту B, і Ви отримуєте переваги побудови веб-пакета (Мініфікація, Хеші, ...).

Однак якщо ваші сценарії не повинні бути загальнодоступними, і якщо вони готові до модулів, ви можете імпортувати їх src/polyfills.tsабо навіть краще імпортувати лише тоді, коли вони вам потрібні у ваших конкретних компонентах.

Зробити глобально доступними сценарії за допомогою scripts:[]або вручну завантажуючи їх, виникає власний набір проблем, і насправді їх слід використовувати лише тоді, коли це вкрай необхідно.


Це чудово, тому що я можу створити файли конфігурації js для кожного середовища, залишати їх там і завантажувати під час виконання, замість того, щоб використовувати файли environment.ts і
— Ерік Філіпс

Чи є у вас якийсь приклад використання поліфайлерів або завантаження в конкретні компоненти?
— Steve Lam

@SteveLam Будьте конкретнішими або задайте нове запитання. Зазвичай полізаповнення не завантажуються в певний компонент, але глобально, якщо ви не хочете, щоб компоненти були автономними, але навіть тоді переважно визначати середовище виконання, яке ви очікуєте, і нехай споживач компонента вирішує, коли і як завантажувати поліфіль.
— Крістіан Ульбріх

Дякую Крісе, у вас є якась стаття про це?
— Steve Lam

Привіт, я використовую angular 7, коли я запускаю додаток mi, скрипт завантажується на індексну сторінку, але мені потрібно використовувати скрипт на іншій сторінці, коли я натискаю на іншій сторінці сценарій вивантажується, як я можу завантажити його на певну сторінку або на цілу заявку?
— Луїс Альберто Хуарес

3

Вам потрібно відкрити файл .angular-cli.jsonфайлу і потрібно шукати, "scripts:"або якщо ви хочете додати зовнішній css, вам потрібно знайти слово "styles":в тому ж файлі.

як приклад, показаний нижче, ви побачите, як bootstrap Js ( bootstrap.min.js) та bootstrap 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 потрібно додати до глобальної області дії та завантажувати так, ніби вони перебувають у тезі сценарію. Ми можемо зробити це за допомогою властивостей програми [0] .scripts та apps [0] .styles angular-cli.json.


7
Відповіді лише на посилання не рекомендуються. Будь ласка, цитуйте основні частини відповіді за посиланням (посиланнями), оскільки відповідь може стати недійсною, якщо пов’язані сторінки зміниться.
— Стюарт Зіглер

-1

Я раніше не використовував angular-cli, але зараз працюю зі збіркою Angular / Webpack. Для того , щоб забезпечити моє додаток з JQuery і іншими виробниками я використовую плагін WebPack, в ProvidePlugin(). Це, як правило webpack.config.js, розміщується у вашій : Ось приклад для бібліотек jquery, lodash та moment. Ось посилання на документацію (яка в кращому випадку неясна)

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

Неймовірно, це насправді дозволяє вам використовувати його відразу, за умови, що всі інші налаштування веб-пакета були зроблені правильно і були встановлені npm.


1
Конфігурація веб-пакета angular cli насправді є частиною пакету вугільних cli-вузлів. Тому, на жаль, я не можу змінити це. Наприклад, в CLI є попередньо встановлені команди для побудови. ng buildцим усім займається cli. Але я думав, що, мабуть, є спосіб додати речі як частину збірки. Але я не бачив жодного яскравого прикладу.
— Kris Hollenbeck

Ах, вибачення. Я відфільтрував кутові 2 запитання, але це проскочило. Удачі.
— zilj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.