webpack - VueJS Single File Component med typescript: Kan ikke finde modulet stuff.vue
Jeg har en simpel projektstruktur:
/src/app2/main.ts /src/app2/components/lib.ts /src/app2/components/stuff.vue
Med webpack, vue-loader og ts-loader.
main.ts har:
import Vue = require('vue');
import Component from './components/lib'
new Vue({
el: '#app2'
});
Når man forsøger at bygge dette med 1 webpack-indgang for /src/app2/main.ts, opstår den fejl, der genereres,:
ERROR in C:\temp\vuetest2\proj\src\app2\components\lib.ts
(2,25): error TS2307: Cannot find module './stuff.vue'.
ERROR in ./src/app2/main.ts
Module not found: Error: Can't resolve './components/lib' in 'C:\temp\vuetest2\proj\src\app2'
@ ./src/app2/main.ts 3:12-39
Hvis jeg ændrer indgangspunktet til src/app2/components/lib.ts, vil det bygge. Jeg forstår ikke, hvorfor main.ts ikke vil bygge.
Indholdet af lib.ts:
import Vue = require('vue');
import Stuff = require('./stuff.vue');
let o = {
Stuff
}
let componentLibrary = {
components: o,
registerExternal: function(v:any) {
for(var k in o) {
v.component(o[k].name, o[k]);
}
},
registerInternal: function() {
for(var k in o) {
Vue.component(o[k].name, o[k]);
}
}
}
export default componentLibrary;
Stuff.vue er bare en simpel enkeltfil Vue-komponent.
Svar #1
Ifølge: https://github.com/vuejs/vue-class-component/blob/master/example/webpack.config.js
Prøv at tilføje appendTsSuffixTo ts-loader indstilling i din webpack.config.js
webpack2
{
test: /\.ts$/,
exclude: /node_modules|vue\/src/,
use: [{
loader: 'ts-loader',
options: {
appendTsSuffixTo: [/\.vue$/]
}
}]
},
Svar #2
Du kan referere til denne PR på GitHub. Faktisk er det ikke en fejl, bare et brugsmæssigt problem.
Jeg antager, at du ønsker at skrive SFC med <script lang="ts">, <script lang="tsx">, *.ts til hjælpefunktioner og klasser, og *.tsx til funktionelle rene komponenter.
ts-loader accepterer kun *.ts eller *.tsx filer til at kompilere (ellers vil det forårsage en fejl, der siger filen ikke findes). Så ts-loader har to muligheder: appendTsSuffixTo og appendTsxSuffixTo. Disse to muligheder accepterer et array af regexp for at matche, hvilke filer du ønsker at kompilere. (Her giver vi ts-loader de *.vue filer, der allerede er behandlet af vue-loader, til at kompilere).
Jeg antager, at du bruger *.ts.vue til <script lang="ts"> SFC vue-fil, mens *.tsx.vue bruges til <script lang="tsx"> SFC vue-fil. ts-loader bør konfigureres som nedenfor:
{
test: /\.tsx?$/,
use: [
{
loader: 'babel-loader'
},
{
loader: 'ts-loader',
options: {
appendTsSuffixTo: [/\.ts\.vue$/],
appendTsxSuffixTo: [/\.tsx\.vue$/]
}
}
],
exclude: /node_modules/
},
Det betyder, at normale *.ts og *.tsx filer, som sendes til ts-loader, vil blive transpileret og derefter sendt til babel-loader for yderligere kompilering. Og andre filer, der ender med .ts.vue, vil blive tilføjet endelsen .ts som *.ts.vue.ts, og filer der ender med .tsx.vue vil blive *.tsx.vue.tsx. Disse filer sendes alle fra vue-loader. Husk, at ts-loader kun accepterer .ts og .tsx filer.
Men vue-loader er ikke smart nok, <script lang="xxx"> vil få vue-loader til at tilføje xxx-loader til yderligere kompilering, og <script lang="tsx"> vil få vue-loader til at tilføje tsx-loader, som ikke eksisterer i verden.
Heldigvis kan vi konfigurere vue-loaders options:
const loaders = {}
loaders.tsx = ['babel-loader', 'ts-loader']
loaders.ts = loaders.tsx
{
test: /\.vue$/,
loader: 'vue-loader',
options: { loaders }
},
Efter at den webpack-konfiguration er færdig. For TSX-support bør du installere nogle JSX-typer og skrive en relateret .d.ts-fil
Du kan tjekke dette repository på GitHub for flere detaljer.
Held og lykke!
