gulp + webpack + css-loader + typescript: "kan ikke finne modul"
Jeg vil bruke css-loader med :local()-funksjonen i mitt utviklingsoppsett.
Ingen feil: import './sidebar.css';
Det kompilerer uten problemer, men så vet jeg ikke hvordan jeg får tilgang til de lokale klassenavnene inne i min .tsx-fil.
Feil: import classNames fra './sidebar.css';
Her får jeg: error TS2307: Kan ikke finne modulen './sidebar.css'
Forklarer oppsettet mitt:
.tsx-filer kompileres til commonjs-moduler via gulp-typescript (ES5)- commonjs-moduler blir kompilert og minifisert til JS via webpack
sidebar.tsx (blir importert i app.tsx hvis det har betydning)
import classNames from './sidebar.css';sidebar.css
.sl-sidebar {
background-color: yellow;
}
gulpfile.js
Gulp-oppgave som kompilerer .tsx-filer til commonJS-moduler (kjører selvfølgelig før webpack-oppgaven):
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));
});
Min gulp-webpack oppgave:
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);
}
});
});
Hva gjør jeg galt?
Rediger: Jeg fant nettopp dette: https://github.com/Microsoft/TypeScript/issues/2709, men jeg forstår det ikke helt. Betyr det at jeg må erklære CSS-en min som en modul?
Svar #1
TypeScript kan ikke laste eller forstå CSS-filer, men det vil fungere med Webpack. For å fortelle TypeScript at det finnes filer med en annen filendelse enn *.ts, må du deklarere en wildcard-modul for den aktuelle filtypen. Sett det bare i en *.d.ts-fil som du inkluderer i prosjektet.
// declaration.d.ts
declare module '*.css' {
const content: any;
export default content;
}
Svar #2
For å laste inn ikke-ts ressurser, deklarer bare require-funksjonen og bruk de importerte ressursene (som any).
Dokumentasjon: https://github.com/TypeStrong/ts-loader#code-splitting-and-loading-other-resources
