使用
导入json文件时,typescript编译器工作正常const tasks = require('./tasks.json')
但是,当我运行tsc
时,输出目录不包含tasks.json
文件,从而导致运行时错误。
有没有办法告诉编译器应该复制所有json文件,还是应该手动将所有json文件复制/粘贴到dist
目录中?
我的tsc compilerOptions目前读取
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"sourceMap": true,
"noImplicitAny": true,
"removeComments": false,
"outDir": "./dist/",
"sourceMap": true,
"pretty": true,
"noImplicitThis": true,
"strictNullChecks": true,
"sourceMap": true
},
谢谢!
答案 0 :(得分:4)
在2.9版及更高版本的打字稿中,您可以直接使用JSON文件,并将其自动复制到dist目录。
这是tsconfig.json
,具有最低配置要求:
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"esModuleInterop" : true,
"module" : "commonjs",
"outDir" : "./dist",
"resolveJsonModule" : true,
"target" : "es6"
},
"exclude" : [
"node_modules"
]
}
然后您可以创建一个json文件。
{
"address": "127.0.0.1",
"port" : 8080
}
样品用量:
import config from './config.json';
class Main {
public someMethod(): void {
console.log(config.port);
}
}
new Main().someMethod();
如果不使用esModuleInterop
属性,则应访问封装在默认字段中的json属性。 config.default.port
。
答案 1 :(得分:2)
使用
导入json文件时,typescript编译器工作正常const tasks = require('./tasks.json')
只要您定义了全局require()
函数,TypeScript就不会抱怨这一点,例如使用node.d.ts
。使用vanilla设置,您实际上get a compile error that require
is not defined。
即使你已经告诉TypeScript有关全局require
函数的信息,它只是将它视为一个预期会返回某个函数的函数,它不会让编译器实际分析该函数需要什么({{1并且对该文件做任何事情。这是Browserify或Webpack等工具的工作,可以解析"tasks.json"
语句的代码库并加载任何内容(JS,CSS,JSON,图像等)到运行时捆绑包用于分发。
使用TypeScript 2.0,您甚至可以告诉TypeScript编译器有关模块路径模式的信息将由使用wildcard (*
) module name declarations的Bundler(Browserify或Webpack)解析和加载:
require
现在,您可以使用ES6模块语法在TypeScript中导入JSON:
declare module "*.json" {
const value: any;
export default value;
}
这不会给出任何编译错误,并且会转换为类似import tasks from "./tasks.json";
的内容,并且您的bundler将负责解析var tasks = require("./tasks.json")
语句并构建包括JSON内容的包。
答案 2 :(得分:0)
您可以在tsconfig.json的“ include”中明确指定它。例如,
<form id="myForm">
<input type="radio" name="myRadio" value="0" />
<input type="radio" name="myRadio" value="1" />
<input type="radio" name="myRadio" value="2" />
</form>
<button onClick="test()">Test</button>
答案 3 :(得分:0)
对于想要复制所有 JSON文件的人们,使用TypeScript确实很困难。即使使用"resolveJsonModule": true
,tsc
也只会复制.json
直接被 引用的import
文件。
这是一些想要执行动态运行时require()
的示例代码。只有将所有JSON文件都复制到dist/
refuses的tsc
文件夹中,此方法才能起作用。
// Works
import * as config from './config.default.json`;
const localConfigFile = `./config.${process.env.NODE_ENV || 'development'}.json`;
if (fs.existsSync(localConfigFile)) {
// Does not work
const envConfig = require(localConfigFile);
Object.assign(config, envConfig);
}
.json
完成后,您可以添加cpy-cli
或copyfiles
步骤to your build process,将所有dist/
文件复制到tsc
文件夹中
这假定您使用npm run build
或类似的东西进行构建。
它还需要额外的devDependency。但这确实达到了将所有.json
文件复制到dist/
文件夹中的原始目标。
例如:
$ npm install --save-dev cpy-cli
// To copy just the json files, add this to package.json
"postbuild": "cpy --cwd=src --parents '**/*.json' ../dist/",
// Or to copy everything except TypeScript files
"postbuild": "cpy --cwd=src --parents '**/*' '!**/*.ts' ../dist/",
现在npm run build
应该运行tsc
,然后再运行cpy
。
或者,不使用.json
文件,而是将配置移到.js
文件中,然后在"allowJs": true
中启用tsconfig.json
。然后tsc
将为您复制文件。
您的新.js
文件将需要如下所示:module.exports = { ... };
我发现了这个想法recommended here,所以+1。
注意:要启用
"allowJs": true
,您可能 还需要添加"esModuleInterop": true
和"declaration": false
,甚至还有"skipLibCheck": true
。这取决于您现有的设置。
请记住在构建之间清除dist/
文件夹和tsconfig.tsbuildinfo
,以便全面测试该过程。 (tsc
不会清除dist/
文件夹,它只会向其中添加新文件,因此早期版本中遗留的旧文件可能会产生误导性的结果。)
答案 4 :(得分:0)
您可以将其包含在构建脚本&& ncp src/res build/res
中,将文件直接复制到outDir