首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wepack强制使用ts-加载程序包含类型记录文件

Wepack强制使用ts-加载程序包含类型记录文件
EN

Stack Overflow用户
提问于 2019-06-06 20:59:34
回答 1查看 1.1K关注 0票数 1

我已经进入了TypeScript,并与Browserify (与tsify一起玩过),它的工作很好,直到我切换到Webpack,使用vue和babel与我的项目。

下面是我的项目结构(简化了,它还使用了ASP.NET核心):

代码语言:javascript
复制
BestAppEver
  ---| [C# stuff]
  ---| scripts
       ---| pages
               - Login.ts
               - Dashboard.ts
       ---| components
               - CoolThing.vue
       - App.ts
  - package.json
  - webpack.config.js
  - tsconfig.json

pages中的文件通常包含如下的jquery声明:

代码语言:javascript
复制
import * as $ from "jquery";
console.log("hi i got loaded!");
$("#deleteConfirmationInput").change(function() {
    if (isInputValid()) {
        $("#deleteConfirmationButton").removeAttr("disabled");
    } else {
        $("#deleteConfirmationButton").attr("disabled", "disabled");
    }
});

这是我的webpack.config.js文件

代码语言:javascript
复制
var path = require('path');
var webpack = require('webpack');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
module.exports = {
    entry: './scripts/App.ts',
    mode: process.env.NODE_ENV || 'production',
    output: {
        path: path.resolve(__dirname, 'wwwroot/js'),
        filename: 'bundle.js',
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader',
            },
            {
                test: /\.ts(x?)$/,
                exclude: /node_modules/,
                use: [
                    {
                        loader: 'babel-loader'
                    },
                    {
                        loader: 'ts-loader',
                        options: {
                            appendTsSuffixTo: [/\.vue$/]
                        }
                    }
                ]
            }
        ]
    },
    resolve: {
        extensions: ['.ts', '.tsx', '.js', '.vue', '.json'],
        alias: {
            'vue$': 'vue/dist/vue.esm.js'
        },
        plugins: [
            new TsconfigPathsPlugin()
        ]
    }
    plugins: [
        new VueLoaderPlugin()
    ],
    devtool: 'source-map'
}

if (process.env.NODE_ENV === 'production') {
    // http://vue-loader.vuejs.org/en/workflow/production.html
    module.exports.plugins = (module.exports.plugins || []).concat([
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: '"production"'
            }
        }),
        new webpack.LoaderOptionsPlugin({
            minimize: true
        })
    ]);
}

使用Browserify和tsify,所有文件都包含并运行,因此"hi i got loaded!"被打印出来。

使用ts-,只包含和运行i 所使用的文件。*没有导入文件,"hi i got loaded!"就没有打印出来。.vue文件的情况并非如此。

是否有一种方法可以自动导入这些文件,并使它们都在最后的包中运行?

谢谢:D

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 21:10:37

简单的答案就是您所发现的:您必须导入文件!Webpack只从您命名为entry (./scripts/App.ts)的文件开始遍历文件树。webpack从来没有见过其他任何东西。

请注意,您可以使用“裸导入”来导入文件,这样做只会产生副作用:

代码语言:javascript
复制
import "./pages/Login.ts";

在这种情况下,您告诉webpack,您不希望Login.ts导出任何东西,但是这个文件应该包含在包中。您可以将这些直接导入放在App.ts中。

这个问题可能是相关的:ES6 Bare Import: How to use, and when?

另一个选项是配置webpack为entry使用多个值。在您的示例中,您应该能够将entry定义为一个字符串数组:

代码语言:javascript
复制
entry: [
  './scripts/App.ts',
  './scripts/Pages/Login.ts',
  './scripts/Pages/Component.ts'
],

如果您想变得聪明,可以通过递归地在scripts目录中列出文件来动态地生成这些文件。毕竟,webpack.config.js只是javascript (节点)。如果有兴趣,我可以扩展答案,包括一个例子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56485009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档