LoginSignup
6
5

More than 3 years have passed since last update.

WebPackのlibraryTargetによる出力結果の違いと、TypeScriptで吐いた.d.tsの悲しみ

Last updated at Posted at 2019-07-24

WebPackのlibraryTargetによる出力結果の違いと、TypeScriptで吐いた.d.tsの悲しみ

 WebPackでライブラリを作成する際、他のプロジェクトからWebPack経由でモジュールとして出力する際は amd 、HTMLの<SCRIPT>から非モジュールとして呼び出す場合は global を使っていました。ぶっちゃけていうと、内容をよく理解せずに使っているわけです。これではまずいので、 libraryTarget の設定でどう出力内容が変わるのかを確認してみることにしました。

出力内容

library の設定を JWF という名前にした時の結果をまとめました。

libraryTarget 一行目
var var JWF =
assign JWF =
this this["JWF"] =
window window["JWF"] =
self self["JWF"] =
global window["JWF"] =
commonjs exports["JWF"] =
commonjs2 module.exports =
commonjs-module module.exports =
amd define("JWF", [], function() { return
amd-require require([], function() { return
umd (function webpackUniversalModuleDefinition(root, factory) {
umd2 (function webpackUniversalModuleDefinition(root, factory) {
jsonp JWF(/******/ (function(modules) { //
system System.register("JWF", [], function

 設定によってwindowのプロパティになったりグローバル変数になったりしています。WebPackから使う場合はモジュールの体を成していれば上手くやってくれますが、<SCRIPT>から直接呼び出すライブラリとして使う場合は、自分できちんと対処する必要があります。とりあえず動いていたので気にしていませんでしたが、もっと早く確認すべき内容でした。

おまけ:TypeScriptの悲しみ

 TypeScriptで開発したコードをWebPackで非モジュールのライブラリを生成した場合、問題になるのがTypeScriptの定義ファイルである .d.ts です。WebPackでモジュールとして開発し、<SCRIPT> から直接呼び出す形に libraryTarget を varglobal 変更しても、.d.ts はモジュールの形式のままとなります。各機能のインスタンスが変数に入っているのに、それを利用したコードを書いても、開発環境の入力補完に対応せず、コンパイル時もエラーの山となります。

 これの対処法を色々と調べたのですが、有用な情報はなぁんにも見つかりませんでした。これで困っている人は人っ子一人いないようです。無いものは作る、有るものですら作るが心情なので、結局自分で変換プログラムを作りました。やっていることはモジュール定義を全て削除、そのかわりnamespaceをlibrary名で作成し囲むというものです。TypeScriptのCompilerAPIを使えば、どこに何の定義があるかを簡単に調べられるので、普通に字句解析するより簡単に作ることが出来ました。欲しい人がいるならWebPackからすぐに使える形にしてnpmに登録することも可能です。しかしニッチすぎて需要は無いでしょう。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5