gulp + webpack + css-loader + typescript:“找不到模块”

时间:2015-10-21 10:32:56

标签: css typescript gulp webpack webpack-style-loader

我想在我的开发设置中使用css-loader :local()功能。

没有错误: import './sidebar.css';

它编译没有问题,但后来我不知道如何访问我的.tsx文件中的本地类名。

错误: import classNames from './sidebar.css';

我得到:error TS2307: Cannot find module './sidebar.css'

解释我的设置:

  1. .tsx文件通过gulp-typescript(ES5)编译到commonjs模块
  2. commonjs模块编译&通过webpack缩小为JS
  3. sidebar.tsx (如果重要的话,会在app.tsx中导入)

    import classNames from './sidebar.css';

    sidebar.css

    .sl-sidebar {
      background-color: yellow;
    }
    

    gulpfile.js

    Gulp任务将.tsx文件编译为commonJS模块(当然在webpack-task之前运行):

    gulp.task('gui-tsx', function () {
        return gulp.src(config.guiTsxPath + '**/*.tsx')
            .pipe(ts({
                jsx: 'react',
                outDir: config.guiCompiledPath,
                module: 'commonjs',
                target: 'ES5'
            }))
            .pipe(gulp.dest(config.guiCompiledPath));
    });
    

    我的gulp-webpack任务:

    gulp.task('gui-webpack', function () {
        webpack({
            bail: false,
            debug: true,
            entry: './' + config.guiCompiledPath + 'app.js',
            output: {
                filename: "gui.js",
                path: './' + config.pubPath + 'js'
            },
            devtool: "#inline-source-map",
            plugins: [
                new webpack.optimize.UglifyJsPlugin({
                    compress: {
                        warnings: false
                    },
                    output: {
                        comments: false,
                        semicolons: true
                    },
                    sourceMap: true
                })
            ],
            module: {
                loaders: [ {
                    test: /\.css$/,
                    loader: 'style-loader!css-loader?modules'
                }]
            }
    
        }, function (err, stats) {
            if (stats.compilation.errors.length > 0) {
                console.log(stats.compilation.errors[0].message);
            }
        });
    });
    

    我做错了什么?

    编辑: 我刚发现:https://github.com/Microsoft/TypeScript/issues/2709 但我不太明白。这是否意味着我必须将我的CSS声明为模块?

2 个答案:

答案 0 :(得分:7)

typescript无法加载或理解css文件,但它可以与webpack一起使用。要告诉TypeScript有些文件的结尾不是* .ts,您必须为相应的文件类型声明通配符模块。只需将其放在项目中包含的* .d.ts文件中即可。

// declaration.d.ts
declare module '*.css' {
    const content: any;
    export default content;
}

答案 1 :(得分:2)

要加载非ts资源,只需声明require函数并使用导入的资源(作为any)。

文档:https://github.com/TypeStrong/ts-loader#code-splitting-and-loading-other-resources