我正在将JS文件迁移到Typescript,我的目标是能够在Vue中同时使用JS和Typescript类。我知道,我可以将Vue脚本转换为Typescript,但是我现在不想这样做。
问题出现在 component.vue 文件中:
this.exceptionHandler = app.resolve('ExceptionHandler');
我在浏览器控制台中看到的错误是这样(可以编译):
"TypeError: Cannot call a class as a function"
ExceptionHandler 是在TypeScript .ts 文件中定义的。
问题是:是否可以先将TS代码转换为JS ES6,然后将代码放在一起,然后对所有内容运行Babel并将其编译为ES5?
我在TS配置中使用以下选项:
"lib": ["es7", "es6", "es5", "dom"],
"types": ["reflect-metadata"],
"module": "commonjs",
"target": "es6",
和Webpack 4配置:
{
test: /\.ts(x?)$/,
loader: 'babel-loader?presets[]=es2015!ts-loader',
exclude: [
"node_modules",
"vendor",
"app",
"public"
]
},
当我只使用 ts-loader 时,代码可以正常工作,但是已编译的JS代码的版本是ES6,而不是ES5。
答案 0 :(得分:1)
这可能对Webapack 4的新手有用。我的工作Webpack配置文件如下所示:
const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const { VueLoaderPlugin } = require('vue-loader');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
let devMode = process.env.NODE_ENV === 'development';
let webUrl = 'http://my-project.localhost/';
if (process.env.NODE_ENV === 'production') {
webUrl = 'https://my-project.com/';
}
else if (process.env.NODE_ENV === 'development') {
webUrl = 'http://my-project.localhost/';
}
module.exports = {
mode: 'development',
devtool: 'inline-source-map',
entry: {
'frontApps': './resources/assets/js/frontApps.ts',
'backAppsAdmin': './resources/assets/js/backAppsAdmin.ts',
'styles' : './resources/assets/sass/styles.scss',
'admin-back' : './resources/assets/sass/admin back/admin-back.scss',
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /(node_modules|bower_components)/,
use: [{
loader: "babel-loader",
options: {
presets: ['@babel/preset-env']
}
}]
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
js: 'babel-loader',
css: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options : {
url: false
}
}
],
fallback: 'vue-style-loader',
}),
}
}
},
{
test: /\.ts(x?)$/,
loader: 'babel-loader?presets[]=@babel/preset-env!ts-loader',
exclude: [
"node_modules",
"vendor",
"app",
"public"
]
},
{
test: /\.(sa|sc|c)ss$/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options : {
url : false,
sourceMap: devMode
}
},
{
loader: 'sass-loader',
options : {
processCssUrls : false,
sourceMap: devMode
}
}
],
}
]
},
output : {
filename : 'js/[name].js',
chunkFilename: 'js/[name].js',
path: path.resolve(__dirname, 'public'),
publicPath: webUrl,
},
optimization: {
splitChunks: {
cacheGroups: {
vendor : {
test : '/node_modules/',
chunks: 'all',
name: 'vendor',
priority: 10,
enforce: true
}
}
},
},
resolve: {
extensions: [ '.tsx', '.ts', '.js', '.vue' ],
alias: {
vue: 'vue/dist/vue.esm.js'
}
},
plugins: [
new VueLoaderPlugin(),
new MiniCssExtractPlugin({
filename: "css/[name].css",
chunkFilename: "css/[id].css"
}),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
}),
new webpack.ProvidePlugin({
'regeneratorRuntime': 'regenerator-runtime/runtime'
}),
]
};
如果要在单个文件Vue组件中使用SASS,请使用以下方法:
<style lang="scss" type="text/scss" scoped>
</style>