Webpack ts-loader: 更改tsconfig文件名

36

我有2个tsconfig文件,一个用于开发构建,另一个用于生产构建。
我用-p标志选择了tsconfig:
tsc -p dev.tsconfig.json

Ts-loader正在查找tsconfig.json文件,如何使用ts-loader指定其他文件名?

module.exports = {
    entry : __dirname + "/src/app/main.ts",
    output : {
        path : __dirname + "/dist",
        filename : "bundle.js"
    },
   resolve : {
     extensions : ["", ".webpack.js", ".web.js", ".js", ".ts"]
   },
   module: {
        loaders: [
            { test: /\.ts?$/, loader: "ts" }
        ]
    }
};
6个回答

48

在Webpack 4中,您需要将选项指定为 use 对象:

use: [{
    loader: 'ts-loader',
    options: {
        configFile: "tsconfig.webpack.json"
    }
}]

完整的Webpack配置:

var path = require('path');

module.exports = {
    entry: path.resolve(__dirname, 'src') + '/index.ts',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'your-library-name.js',
    },
    module: {
        rules: [
            {
                test: /\.ts$/,
                use: [{
                    loader: 'ts-loader',
                    options: {
                        configFile: "tsconfig.webpack.json"
                    }
                }],
                exclude: /node_modules/,
            }
        ]
    },
    mode: 'development',
    resolve: {
        extensions: ['.js', '.ts']
    },
    devtool: false
};

3
谢谢!请注意,对于仍然在努力的其他人来说,从 ts-loader 文档中可以得知,如果您提供了一个相对路径到一个 tsconfig 文件,"它将相对于相应的 .ts 入口文件解析。" - Hunter Wright

26
以下是关于如何指定configFile的说明(自2017年12月Webpack 3.10.0版本开始,原名为configFileName,正如Frank所述)。

Webpack配置

注意:版本2以来,Webpack已经使用module.rules而不是module.loaders,并且已经弃用了查询参数,转而使用options对象。
module.exports = {
    entry:  {
        "./build/bundle" : "./src/startup/Entry.ts"
    },
    output: {
        filename: '[name].js',
        libraryTarget: 'this'
    },
    devtool: 'source-map',
    resolve: {
        modules: [".", "node_modules"],
        extensions: [".js", ".webpack.js", ".web.js", ".d.ts", ".ts", ".tsx"]
    },
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                exclude: [/node_modules/],
                loader: "ts-loader",
                options: {
                    configFile: "webpack_configs/tsconfig.webpack.json"
                }
            }
        ]
    },
    plugins: []
};

目录结构

我的目录结构的根目录如下:

webpack.config.js
webpack_configs/tsconfig.webpack.json
tsconfig.json
package.json
src/*
test/*
node_modules/*
build/*

...其中*表示多个文件。

Typescript配置

tsconfig.webpack.json本身只是通过排除test文件夹来扩展我的通用tsconfig.json

{
    "extends": "../tsconfig",
     "exclude": [
       "node_modules",
       "test"
     ]
}

...但是你不需要两个webpack配置文件才能从configFile设置中受益;你可以简单地使用它来将目标定位到自定义位置的单一tsconfig.json


这种方法在 WebPack 4 中已经不再适用。请参见我在此页面上的答案中的解决方案。 - mvermand

12

更新(Webpack 4):如评论所述,语法已更改,详见下方答案


Webpack使我们能够为每个加载器添加自定义选项。所有ts-loader配置属性在这里进行了描述。

configFileName是您要查找的属性。应该像这样:

module.exports = {
    entry : __dirname + "/src/app/main.ts",
    output : {
        path : __dirname + "/dist",
        filename : "bundle.js"
    },
    resolve : {
        extensions : ["", ".webpack.js", ".web.js", ".js", ".ts"]
    },
    module: {
        loaders: [
            { test: /\.ts?$/, loader: "ts" }
        ]
    },
    ts: {
        configFileName : 'dev.tsconfig.json'
    }
};

太好了!那我就这么做:module.exports = env => ({ ts : { configFileName : env.build === 'dev' ? 'dev.tsconfig.json' : 'acc.tsconfig.json'' } }) - gr3g
21
过时。文档不再提及ts.configFileName选项。 - Ozymandias
8
不再有效,请参阅此答案 - Liam
1
不确定他们是否更改了,但选项的名称是:configFile:https://github.com/TypeStrong/ts-loader#options。答案中建议的名称会导致webpack出错。 - Andry

11

8

2017年9月6日更新

configFileName已被废弃,建议使用configFile - 来源


4
我没有足够的声望来发表评论,所以我很抱歉将其作为答案添加。显然有人不喜欢这样做。 =) - Frank Stallone III

3
尝试在加载器名称后使用“configFile”作为查询字符串。这里是webpack配置和ts-loader的配置。请参考webpack配置ts-loader的配置
module.exports = {
   entry : "./main.ts",
   output : {
        path : __dirname + "/dist",
        filename : "bundle.js"
   },
   resolve : {
       extensions : ["", ".js", ".ts"]
   },
   module: {
     loaders: [
        { test: /\.ts?$/, loader: "ts-loader?configFile=src/tsconfig.server.json" }
     ]
   },
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接