【问题标题】:Exported TypeScript Class not included in WebPack bundle if not used directly如果不直接使用,则导出的 TypeScript 类不包含在 WebPack 包中
【发布时间】:2016-05-31 23:44:36
【问题描述】:

我正在将使用 Angular 1.x 的 javascript 项目转换为 WebPack 和 TypeScript(使用 ts-loader)。我大部分时间都在工作,但是当 ts-loader 似乎在不直接使用导出时优化我的脚本时,我遇到了麻烦。

这是一个演示问题的示例项目(npm install、webpack,然后加载 index.html 并观察控制台)。

https://github.com/bbottema/webpack-typescript

来自 ClassA 的日志记录正在显示,但 angular 报告 ClassB 丢失(提供程序)。如果您查看 bundle.js,您会发现 ClassB 完全丢失了。不同的是ClassA在导入后直接开始使用,ClassB在编译时只按类型引用。

这是一个错误,还是有办法强制包含 ClassB?还是我做错了? Angular 2 可能会解决这个问题,但现在这一步太大了。

上述项目的相关脚本:


package.json

{
    "devDependencies": {
        "typescript": "^1.7.5",
        "ts-loader": "^0.8.1"
    },
    "dependencies": {
        "angular": "1.4.9"
    }
}

webpack.config.js

var path = require('path');

module.exports = {
    entry: {
        app: './src/entry.ts'
    },
    output: {
        filename: './dist/bundle.js'
    },
    resolve: {
        root: [
            path.resolve('./src/my_modules'),
            path.resolve('node_modules')
        ],
        extensions: ['', '.ts', '.js']
    },
    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader'
        }]
    }
};

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs"
  },
  "exclude": [
    "node_modules"
  ]
}

index.html

<!doctype html>
<html ng-app="myApp">
    <body>
        <script src="dist/bundle.js"></script>
    </body>
</html>

entry.js

declare var require: any;

'use strict';

import ClassA = require('ClassA');
import ClassB = require('ClassB');

var a:ClassA = new ClassA(); // direct use, this works

var angular = require('angular');

angular.module('myApp', []).
    // this compiles as it should, but in runtime the provider will not be packaged and angular will throw an error
    run(function(myProvider: ClassB) {
    }
);

ClassA.ts

// this line will be logged just fine
console.log('ClassA.ts: if you see this, then ClassA.ts was packaged properly');

class ClassA {
}

export = ClassA;

ClassB.ts

declare var require: any;

// this line is never logged
console.log('ClassB.ts: if you see this, then ClassB.ts was packaged properly');

class ClassB {
}

var angular = require(angular);

angular.module('myApp').service(new ClassB());

export = ClassB;

【问题讨论】:

    标签: javascript typescript webpack ts-loader


    【解决方案1】:

    Turns out you have to signal WebPack 通过添加额外的 require 调用而不使用 import 语句来显式包含模块。

    我还没有准备好通过添加重复导入来破坏我的 .ts 文件,所以我为此使用了preprocessor loader

    {
        "line": false,
        "file": true,
        "callbacks": {
        "fileName": "all",
        "scope": "line",
        "callback": "(function fixTs(line, fileName, lineNumber) { return line.replace(/^(import.*(require\\(.*?\\)))/g, '$2;$1'); })"
        }]
    }
    

    作为概念证明,这个正则表达式版本非常有限,它只支持以下格式:

    import ClassA = require('ClassA');
    // becomes
    require('ClassA');import ClassA = require('ClassA');
    

    但这对我有用。同样,我添加了require shim:

    {
        "fileName": "all",
        "scope": "source",
        "callback": "(function fixTs(source, fileName) { return 'declare var require: any;' + source; })"
    }
    

    我用这个解决方案创建了一个sample project

    【讨论】:

    • 我仍然在 8.0.4 中看到这个。是否有一个功能请求我可以赞成修复这个问题,因为这有点荒谬。
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2021-05-10
    • 2021-11-10
    相关资源
    最近更新 更多