导出 TS 以支持 ES6、CommonJS 和 HTML <script> 标签
Export TS to support ES6, CommonJS, and HTML <script> tag
我正在编写一个导出对象的 TS 库:
export const MyLibName: SDKExport = { ... }
这个库将在 npm 上分发,我希望其他人无论他们的设置如何都能够导入它,即它应该能够以下列方式使用:
// ES6
import { MyLibName } from './myLib';
// CommonJS
const { MyLibName } = require('./myLib');
// Browser
<script src="https://cdn.jsdelivr.net/npm/myLib/dist/dist.min.js"></script>
<script console.log(MyLibName) </script>
浏览器部分被证明是最棘手的,因为它需要用 MyLibName
对象“污染”全局命名空间。我可以做到这一点,但我不清楚如何在使用 CommonJS/ES6.
显式导入库时以不污染全局命名空间的方式做到这一点
这是我的 tsconfig.json:
{
"compilerOptions": {
"lib": ["ES2019"],
"module": "es6",
"target": "es5",
"moduleResolution": "node",
"noUnusedLocals": true,
"noUnusedParameters": true,
"sourceMap": true,
"outDir": "build",
"strict": true,
"noImplicitAny": true,
},
"include": ["./**/*.ts"],
"exclude": ["node_modules", ".vscode", "test"]
}
很明显,您在浏览器中导入的脚本必须与您的 CommonJS/ES6 导入不同,如果您希望一个脚本污染全局名称空间而不是另一个。只需创建一个像这样的文件,并在其上使用您的捆绑器来创建您的库的“浏览器版本”:
import { MyLibName } from './myLib';
window.MyLibName = MyLibName;
(您的项目中似乎已经有一个 bundler/minifier,所以我不会详细介绍如何设置它们。)
我尝试使用 with browserify,但由于 browserify 添加到导出文件的所有额外代码,遇到了难以调试的问题。我接受这个答案,因为它是复杂代码库的正确答案。
对于我自己的项目,它只包含一个文件,我发现使用 "module": "ES6"
TS 编译器选项和 运行 sed -i 's/\export //g' dist/index.js
导出 TS 代码效果很好删除 export
关键字。这样,导出的文件只有 const MyLibName = { ... }
,从而将对象添加到全局命名空间。
我正在编写一个导出对象的 TS 库:
export const MyLibName: SDKExport = { ... }
这个库将在 npm 上分发,我希望其他人无论他们的设置如何都能够导入它,即它应该能够以下列方式使用:
// ES6
import { MyLibName } from './myLib';
// CommonJS
const { MyLibName } = require('./myLib');
// Browser
<script src="https://cdn.jsdelivr.net/npm/myLib/dist/dist.min.js"></script>
<script console.log(MyLibName) </script>
浏览器部分被证明是最棘手的,因为它需要用 MyLibName
对象“污染”全局命名空间。我可以做到这一点,但我不清楚如何在使用 CommonJS/ES6.
这是我的 tsconfig.json:
{
"compilerOptions": {
"lib": ["ES2019"],
"module": "es6",
"target": "es5",
"moduleResolution": "node",
"noUnusedLocals": true,
"noUnusedParameters": true,
"sourceMap": true,
"outDir": "build",
"strict": true,
"noImplicitAny": true,
},
"include": ["./**/*.ts"],
"exclude": ["node_modules", ".vscode", "test"]
}
很明显,您在浏览器中导入的脚本必须与您的 CommonJS/ES6 导入不同,如果您希望一个脚本污染全局名称空间而不是另一个。只需创建一个像这样的文件,并在其上使用您的捆绑器来创建您的库的“浏览器版本”:
import { MyLibName } from './myLib';
window.MyLibName = MyLibName;
(您的项目中似乎已经有一个 bundler/minifier,所以我不会详细介绍如何设置它们。)
我尝试使用
对于我自己的项目,它只包含一个文件,我发现使用 "module": "ES6"
TS 编译器选项和 运行 sed -i 's/\export //g' dist/index.js
导出 TS 代码效果很好删除 export
关键字。这样,导出的文件只有 const MyLibName = { ... }
,从而将对象添加到全局命名空间。