diff --git a/CHANGELOG.md b/CHANGELOG.md index 48769cd..d42e858 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,11 @@ ---- -## 3.0.0-alpha.6 (2022-09-21) +## 3.0.0-alpha.7 (2023-11-20) + +- feat: dynamic import optional dependencies. + +## 3.0.0-alpha.6 (2023-11-12) - feat: support [Intl.Segmenter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter) for segment. - dict: 雪茄 diff --git a/babel.config.js b/babel.config.js index 325997f..8301a4c 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,7 +1,7 @@ module.exports = { presets: [ - [ '@babel/preset-env', {targets: {node: 'current'}} ], - [ '@babel/preset-typescript', {allExtensions: true}], + [ "@babel/preset-env", {targets: {node: "current"}} ], + [ "@babel/preset-typescript", {allExtensions: true}], ], - 'compact': true, + "compact": true, }; diff --git a/package.json b/package.json index 2ab1c7c..78a5c37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pinyin", - "version": "3.0.0-alpha.6", + "version": "3.0.0-alpha.7", "description": "汉语拼音转换工具。", "main": "./lib/pinyin.js", "module": "./esm/pinyin.js", diff --git a/src/segment.ts b/src/segment.ts index 9435df9..e39cc19 100644 --- a/src/segment.ts +++ b/src/segment.ts @@ -1,7 +1,3 @@ -import nodejieba from "nodejieba"; -import { load, cut /*, tag */ } from "@node-rs/jieba"; -// @ts-ignore -import { Segment, useDefault } from "segmentit"; import type { IPinyinSegment } from "./declare"; let nodeRsJiebaLoaded = false; // @node-rs/jieba 加载词典。 @@ -13,41 +9,50 @@ let hansIntlSegmenter: any; // Intl.Segmenter * 分词并标注词性。 */ export function segment(hans: string, segment?: IPinyinSegment): string[] { - // @node-rs/jieba (Rust) - if (segment === "@node-rs/jieba") { - if (!nodeRsJiebaLoaded) { - nodeRsJiebaLoaded = true; - load(); + try { + // @node-rs/jieba (Rust) + if (segment === "@node-rs/jieba") { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { load, cut /*, tag */ } = require("@node-rs/jieba"); + if (!nodeRsJiebaLoaded) { + nodeRsJiebaLoaded = true; + load(); + } + return cut(hans, false); + // return tag(hans); } - return cut(hans, false); - // return tag(hans); - } - // segmentit (Node.js) - if (segment === "segmentit") { - if (!segmentit) { - segmentit = useDefault(new Segment()); + // segmentit (Node.js) + if (segment === "segmentit") { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { Segment, useDefault } = require("segmentit"); + if (!segmentit) { + segmentit = useDefault(new Segment()); + } + return segmentit.doSegment(hans, { + simple: true, + }); } - return segmentit.doSegment(hans, { - simple: true, - }); - } - // Intl.Segmenter - if (segment === "Intl.Segmenter") { - if (typeof Intl?.Segmenter === "function") { - if (!hansIntlSegmenter) { - hansIntlSegmenter = new Intl.Segmenter("zh-Hans-CN", { - granularity: "word", - }); + // Intl.Segmenter + if (segment === "Intl.Segmenter") { + if (typeof Intl?.Segmenter === "function") { + if (!hansIntlSegmenter) { + hansIntlSegmenter = new Intl.Segmenter("zh-Hans-CN", { + granularity: "word", + }); + } + return [...hansIntlSegmenter.segment(hans)].map((s) => s.segment); } - return [...hansIntlSegmenter.segment(hans)].map((s) => s.segment); } - } - // 默认使用 nodejieba (C++) - // return nodejieba.tag(hans); - // nodejieba 定义的类型返回值错误,先忽略。 - // @ts-ignore - return nodejieba.cutSmall(hans, 4); + // eslint-disable-next-line @typescript-eslint/no-var-requires + const nodejieba = require("nodejieba"); + // 默认使用 nodejieba (C++) + // return nodejieba.tag(hans); + // nodejieba 定义的类型返回值错误,先忽略。 + return nodejieba.cutSmall(hans, 4) as unknown as string[]; + } catch (ex) { + return [hans]; + } }