LoginSignup
10
5

More than 3 years have passed since last update.

denoでnpmのモジュールの代替方法を探す

Last updated at Posted at 2020-06-17

 この記事、自信満々な感じで書いてますが、間違いがある可能性があります。なぜならば、私の英語力が乏しいからです。何か間違いがあったら教えてくださると助かります。

denoじゃ当然npmは使えません

 denoはnodejsを作り直したいと考えたnodejsの作者が作ったものです。nodejsの様々な悪い点を改善しているわけですが、1つ困った点があります。そう、たくさんある便利なnpmモジュール達が使えないのです。そこら辺の経緯はDenoの登場でNode.jsの時代は終わるのか?を読んでいただくと面白いと思います。denoの標準モジュールやサードパーティーライブラリは便利なものもたくさんありますが、実際現時点ではnpmモジュールが使いたい場面が出てくるんじゃないでしょうか。実際私はxml→Jsonへの変換をしたいと思ってそこで困ることになりました。そこで私の調べた対処方法を共有したいと思います。

①諦めて自分で実装する

 これは誰でも思いつきますよね。denoのいいところの1つとして、githubからimport直接できる事が挙げられます。故に、ちょっとしたモジュールなら自作した方が早そうです。
参考:Denoの自作モジュールをGitHubから読み込む

 しかし、xml変換は時間がかかりそうなので、少しやってみて断念しました。

②denoのURL変換ツールを使う

実験的な機能ですが、npmのモジュールをインポートする機能がついています。
書き方はこんな感じです。(xml2jsonを使う場合)

// npm:パッケージよりあとはpackage.jsonのmainに記載されているファイル名を入れてください。
import * as xml2json from 'https://deno.land/x/npm:xmltojson/lib/xmlToJSON.js'

実験的:npm:[package]またはgh:[owner]:[repo]をモジュール名として使用して、任意のリポジトリリポジトリまたはnpmパッケージを解決します。
※Google翻訳を通しています。
https://deno.land/x

 しかし、これも駄目でした。require is not defined が出ました。
 おそらくですが、node特有の文法(require()など)がないモジュールならimportできるようです。(大体のモジュールはrequire使っていそうな気がしますが…。)

③node_modulesからimportする

 本末転倒感ありますが、npmでインストールしたローカルのパッケージを使う方法もあります。How to use npm module in DENO?を参考にしています。

import { createRequire } from "https://deno.land/std/node/module.ts";

const require = createRequire(import.meta.url);
const xml2json = require("xml2json");

 これも②と同じ理由で駄目でした。

④CDN(Content Delivery Network)プロバイダを使う

これもHow to use npm module in DENO?を参考にしています。
 3つのjsモジュール用CDNプロバイダの中で、必要なモジュールがあるものを選択して使ってください。

Also take a look at CDN providers, that can auto-convert npm packages to ES Modules (ESM):
Pika CDN
jspm.io
unpkg.com with ?module query parameter

https://stackoverflow.com/questions/61821038/how-to-use-npm-module-in-deno

 ただし、これらのCDNプロバイダの安全性などは私の方では調べていないので、自己責任でお願いします。
 私はこの方法でなんとかxmlをJsonへ変換するモジュールを見つけました。

 こんな感じです。

import * as xmlParser from 'https://cdn.pika.dev/fast-xml-parser@^3.17.3';

※CDNとは

CDNとは「Content Delivery Network」の略です。同一のコンテンツを、 多くの配布先、例えば多くのユーザーの端末に効率的に配布するために使われる仕組みです。

手法としては、 まず配布先に近いネットワーク(カスタマーエッジと呼ばれます)に、コンテンツを配布するサーバ(ここではエッジサーバと呼びます)を接続します。 次にあらかじめエッジサーバに、配布するコンテンツのコピーを置いておきます。 最後に、ユーザーがコンテンツにアクセスする時には、ネットワーク的に最も近いエッジサーバに誘導します。

ユーザーの視点では、レスポンスが早く、そしてダウンロードが速くなります。 コンテンツ提供者の視点では、オリジナルファイルを置いているサーバ(オリジンサーバと呼ばれます)へのトラフィック集中が避けられる、 サービスの耐障害性を高められる、といったメリットがあります。

具体的にはソフトウェアのバージョンアップに伴うファイルの配布、 動画の配信などに使われています。

https://www.nic.ad.jp/ja/basics/terms/cdn.html

まとめ

 今回紹介したのは、下記の4つの方法です。
①諦めて自分で実装する
②denoのURL変換ツールを使う
③node_modulesからimportする
④CDN(Content Delivery Network)プロバイダを使う
 今後denoが普及すれば必要ないですが、現段階では選択肢の1つとしてこれらの方法を検討していただくと良いのではないでしょうか。

10
5
1

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