Ответ 1
awesome-typescript-loader
позволяет использовать typescript непосредственно из node_modules
.
Как создать библиотеку typescript с webpack, которую я могу использовать в другом проекте typescript, управляемом webpack?
В проекте ES6 я могу оставить все файлы как ES6 в библиотеке, а в моем клиентском приложении webpack скомпилирует мою библиотеку в ES5 с некоторой конфигурацией. Однако с ts-loader
он не будет компилировать любые ts файлы в node_modules
и вместо этого ожидает, что файлы будут скомпилированы с соответствующим файлом типизации.
1.) Как настроить сборку библиотеки в проекте библиотеки для создания соответствующих css, файлов и скомпилированного javascript с типом?
2.) Как только у меня будет подходящая сборка, как я могу использовать эти файлы в другом проекте?
У меня есть ряд компонентов angular2, поэтому мне нужны изображения /css/javascript для переноса компонентов из библиотеки и использования в клиентском приложении. Оба приложения имеют тяжелые внешние зависимости, управляемые webpack.
awesome-typescript-loader
позволяет использовать typescript непосредственно из node_modules
.
Пусть сначала укажите результат:
Ваши компоненты Angular находятся в папке shared
, которая также содержит следующий файл package.json
:
{
"name": "shared",
"private": true,
"version": 0.0.0,
"dependencies": {
[...additional dependencies...]
}
}
В папке projectA
и projectB
находятся два проекта, которые потребляют ваш общий пакет, написав:
{
[...]
"dependencies": {
[...]
"shared": "file:../shared"
[...]
}
}
В настоящее время разные версии npm
и yarn
обрабатывают ситуацию по-другому:
npm < 5.0.0
копирует папку shared
в локальную папку node_modules
при запуске npm install
. Поэтому, если вы изменяете какие-либо общие компоненты Angular, вам необходимо повторно запустить команду установки. Поскольку это может быть субоптимальным во время разработки, можно использовать linklocal для создания символической ссылки вместо копирования всей папки.
npm >= 5.0.0
ведет себя как linklocal
, он просто создает символическую ссылку во время работы npm install
. (Примечание: если во время npm install
вы столкнулись с ошибкой, это может быть из-за # 16812, который исправлен в версии 5.0. 3-canary.8 (просто запустите npm i -g [email protected]
))
yarn
ведет себя как npm < 5.0.0
, на момент написания есть не планирует изменять это поведение, но ссылка по крайней мере, возможно running yarn link
.
Для компиляции файлов Typescript и SASS существует несколько параметров:
Весьма полезный вариант (особенно для разработки) заключается в том, чтобы хранить только ваши файлы TS, SASS (и изображения) в вашем общем пакете. Затем вы можете включить эти файлы в свой проект (например, с помощью include SampleComponent from 'shared/path/to/file'
), они будут скомпилированы в соответствии с правилами вашего модуля в конфигурационных файлах ваших проектов (не забудьте удалить папку node_modules
из ваш список исключений tsconfig или используйте files
свойство или просто переключитесь на awesome-typescript-loader
вместо ts-loader
).
Преимущество этого подхода в том, что ваши проекты будут обновляться сервером webpack dev, как только вы измените свои общие компоненты. Однако недостатком является то, что результат компиляции может различаться между различными проектами из-за разных настроек, которые могут зайти так далеко, что проекты генерируют новые и разные файлы в рамках общего пакета.
Поэтому, как вы упомянули, вы можете использовать webpack
в своем совместном проекте для его ручной компиляции. Вам просто нужен файл webpack.config.js
, похожий на один из ваших основных проектов (который включает компилятор Typescript (с флагом declaration
компилятора, установленным для генерации файлов .d.ts
) и компилятором SASS и возможно, плагин extract-text-webpack-plugin
для извлечения вашего скомпилированного CSS-кода в отдельный файл).
Внутри projectA
и projectB
вы можете использовать общий пакет, как и любой другой пакет npm (не забудьте указать файл CSS и скопировать изображения из вашего плагина в папку dist с помощью file-loader
плагин).
Используя второй подход, по-прежнему можно использовать сервер webpack dev, однако вам нужно настроить (и запустить) два процесса: один, который следит за общей папкой и перекомпилирует пакет и один (в рамках вашего проекта), который следит за изменениями в пакете скомпилированных файлов.
Вариант 1:
Если вы хотите самостоятельно построить библиотеку, вам следует, вероятно, пойти с одним из нескольких стартеров библиотеки, например: https://github.com/Hotell/typescript-lib-starter А затем просто импортируйте модуль javascript node.
Вариант 2:
Также никто не останавливает вас от создания модуля node только с вашими файлами и активами typescript без компилируемого javascript.
Вы можете опубликовать это или связать его с локальной папкой с npm link
.
Затем вы просто используете относительный typescript импорт, как это.
import {Foo} from "../../node_modules/typescript-example-lib/src/index"
Прямо импортируемый файл будет подхвачен компилятором typescript, даже если вы исключили node_modules
в tsconfig.json
.
Остальная часть материала должна автоматически обрабатываться Webpack. Просто не забудьте исключить этот путь из вашего typescript -loader в Webpack.
С вариантом 2 вам всегда приходится перекомпилировать библиотечный код при компиляции своего клиентского приложения, это в основном просто ссылка на файлы вашей библиотеки. Вариант 1 не имеет этих накладных расходов, поскольку он предварительно скомпилирован и привязан к версии, которую вы импортируете как модуль node.
Есть много способов сделать это.
Вариант 1 - Сборка script
Используйте что-то вроде gulp-ts, grunt-ts или просто пакет script, чтобы скопировать файлы в папку в основном проекте.
В качестве альтернативы запустите событие сборки в Visual Studio, которое скопирует файлы в основной проект.
Вариант 2 - пакет npm
Если вы используете npm, вы можете создать пакет для своего другого проекта. Затем вы можете использовать свой пакет в своем основном проекте. Указание локальной зависимости - это хороший способ сделать это или используя что-то вроде sinopia, который является частным сервером репозитория. Я никогда не использовал его, но похоже, что он будет работать хорошо.
Вариант 3 - пакет NuGet
Вы можете посмотреть создание пакета nuget, а затем установить его локально.
Вариант 4 - --declaration
--outDir
вариант компилятора
Вы можете установить параметр компилятора --outDir
или свойство outDir
в tsconfig.json
с каталогом в другой проект, а затем скомпилировать его с помощью --declaration
, чтобы он также генерировал файлы декларации (.d.ts
), Например: --declaration --outDir ../Test1/External
.
И последнее, но не менее важное (использование --out
)
Вы можете сделать что-то подобное в Visual Studio, если вы щелкните правой кнопкой мыши на проекте библиотеки и щелкните свойства. В TypeScript Build tab
отметьте опцию Combine JavaScript output into file
и укажите местоположение в своем основном проекте, который вы хотите, чтобы он прошел (пример $(SolutionDir)/TypedApp/External/TypedLibrary.js
). Затем также отметьте Generate declaration files
, чтобы сгенерировать файл .d.ts
.
Настройка проекта для автоматизированных построек
Как только это будет сделано, создайте проект библиотеки, а затем включите .js и .d.ts в свой основной проект. Добавьте файл .js в свой html и укажите .d.ts в своих файлах typescript.
Включить файлы в основной проект
Каждый раз, когда вы перестраиваете проект библиотеки, он автоматически обновляет основной проект с изменениями.