typescript - استفاده از فایلهای غیر '.ts'/'.tsx' در 'ts_library' به عنوان وابستگیها


من در حال تلاش برای وارد کردن یک فایل JSON از TypeScript هستم (بله، من از فلگ resolveJsonModule در tsconfig خود استفاده میکنم). مشکل این است که نمیدانم چگونه میتوانم این فایل JSON را به ts_library بدهم (این همچنین برای هر فایل غیر .ts و .tsx دیگر، مانند یک .env هم صادق است). ts_library همیشه به من میگوید که نمیتواند فایل JSON من را پیدا کند.

به عنوان مثال اگر من این ts_library را در یک BUILD.bazel داشته باشم:

ts_library(
    name = "src",
    srcs = glob(["*.ts"]),
    deps = [
        "@npm//:node_modules",
    ]
)

با این index.ts:

import test from './test.json';

console.log(test);

و این test.json:

{
  "foo": "bar"
}

این را به من خواهد داد:

index.ts:1:18 - error TS2307: Cannot find module './test.json'.

فکر میکنم به نوعی نیاز دارم که فایل json را در deps قاعده خودم اضافه کنم. اما نمیدانم چطور این کار را انجام دهم، چون deps فایلهای مستقیم مثل //:test.json را قبول نمیکند.

پاسخ شماره ۱

شما میتوانید فایلها را به قانون ts_library از طریق ویژگی data اضافه کنید (https://www.npmjs.com/package/@bazel/typescript#data). این جایی است که میتوانید ارجاع به فایل JSON را اضافه کنید.

با این حال، ts_library فرمت ماژول خروجی را نادیده میگیرد و resolveJsonModule فقط میتواند با commonjs، amd، es2015 یا esNext استفاده شود (ts_library آن را به UMD تغییر میدهد)

Option '--resolveJsonModule' can only be specified when module code generation is 'commonjs', 'amd', 'es2015' or 'esNext'.

با این حال، شما میتوانید این کار را انجام دهید اگر مستقیماً از کامپایلر تایپاسکریپت از طریق Bazel استفاده کنید، نه از طریق ts_library:

load("@npm//typescript:index.bzl", "tsc")

srcs = glob(["*.ts"])
deps = ["@npm//@types/node"]
data = ["test.json"]

tsc(
    name = "src",
    data = srcs + deps + data,
    outs = [s.replace(".ts", ext) for ext in [".js", ".d.ts"] for s in srcs],
    args = [
        "--outDir",
        "$(RULEDIR)",
        "--lib",
        "es2017,dom",
        "--downlevelIteration",
        "--declaration",
        "--resolveJsonModule",
    ] + [
        "$(location %s)" % s
        for s in srcs
    ],
)

میتوانید با استفاده از nodejs_binary امتحان کنید که کار میکند:

load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")

nodejs_binary(
    name = "src_bin",
    data = [
        ":src",
    ] + data,
    entry_point = "//src:index.ts",
)

اطلاعات بیشتر در مورد استفاده از tsc به جای ts_library در اینجا: https://github.com/bazelbuild/rules_nodejs/blob/master/packages/typescript/docs/install.md