Babel 7 + Inversify 4 + WebPack 4 - @inject 上的意外字符'@'

Posted

技术标签:

【中文标题】Babel 7 + Inversify 4 + WebPack 4 - @inject 上的意外字符\'@\'【英文标题】:Babel 7 + Inversify 4 + WebPack 4 - Unexpected character '@' on @injectBabel 7 + Inversify 4 + WebPack 4 - @inject 上的意外字符'@' 【发布时间】:2019-03-04 14:26:26 【问题描述】:

我有一个打字稿 Vue SPA 项目,我使用 Inversify。

我使用 awesome-typescript-loader 来编译我的打字稿源代码;现在我想切换到 Babel 但是当我编译我的应用程序 webpack 时会出现这个错误:

模块解析失败:意外字符 '@' (38:25) 您可能需要一个 适当的加载器来处理这种文件类型。 | _inherits(ReportService, _BaseService); | > 函数 ReportService(@inject(TYPES.Urls) |网址) | var _this; @ ./app/Ioc/container.ts 6:0-54 14:39-52 @ ./app/startup.ts

.babelrc


    "presets": [
        "@babel/env",
        "@babel/preset-typescript"
    ],
    "plugins": [
        ["@babel/plugin-proposal-decorators",  "legacy": true ],
        "@babel/proposal-class-properties",
        "@babel/proposal-object-rest-spread"
    ]

tsconfig.json


  "compilerOptions": 
    "baseUrl": ".",
    "paths": 
      "test/*": [ "test/*" ],
      "@/*": [ "app/*" ]
    ,
    "lib": [ "es6", "dom" ], // es6 minimum required for Promise
    "target": "es6", // Required for vuetify
    "strict": true,
    "module": "esNext",
    "moduleResolution": "node",
    "experimentalDecorators": true, // Required for @Component for Vue
    "strictPropertyInitialization": false,
    "noImplicitAny": false,
    "allowUnusedLabels": false,
    "noEmit": true,
    "noUnusedLocals": true,
    "noImplicitReturns": true,
    "emitDecoratorMetadata": true
  ,
  "exclude": [
    "node_modules"
  ]

webpack.config.js

const config = 
    entry: 
        app: './app/startup.ts'
    ,
    output: 
        path: path.resolve(__dirname, "wwwroot", "dist"),
        filename: '[name].js'
    ,
    module: 
        rules: [
            
                test: /\.(html)$/,
                use: 
                    loader: 'html-loader'
                
            ,
            
                test: /\.ts$/,
                exclude: /node_modules/,
                use: 
                    loader: 'babel-loader'
                
            ,
            
                enforce: "pre",
                test: /\.js$/,
                loader: "source-map-loader",
                exclude: [
                    path.join(process.cwd(), 'node_modules')
                ]
            ,

        ]
    ,
    resolve: 
        alias: 
            'vue': 'vue/dist/vue.esm.js',
            '@': path.join(__dirname, 'app')
        ,
        extensions: ['.vue', '.ts', '.js']
    ,
    optimization: 
        splitChunks: 
            cacheGroups: 
                vendors: 
                    test: /[\\/]node_modules[\\/]/,
                    name: "vendors",
                    chunks: "all",
                    enforce: true,
                    priority: -10
                
            
        
    

如果我使用 awesome-typescript-loader 链接到 babel-loader


    test: /\.ts$/,
    exclude: /node_modules/,
    use: ['babel-loader', 'awesome-typescript-loader']

并删除不必要的 babel 插件并对其进行预设。

【问题讨论】:

类、方法和属性装饰器有效吗?如果是这样,也许 babel 还不支持在函数参数上转译装饰器,但我不确定 是的,装饰器可以工作。谢谢 我遇到了同样的问题,我通过添加额外的插件“babel-plugin-transform-function-parameter-decorators”解决了这个问题,但是在我的情况下,这只是部分解决了这个问题,因为现在即使转译成功,我得到“在使用构造函数注入时缺少所需的注入或多注入注释:参数 0” 【参考方案1】:

这是@babel/preset-typescript 实现的一个非常烦人的问题: 它会剥离类型并且不会在输出代码中发出相关元数据。

唯一有帮助的是babel-plugin-transform-typescript-metadata


  "plugins": [
    "babel-plugin-transform-typescript-metadata",
    ["@babel/plugin-proposal-decorators",  "legacy": true ],
    ["@babel/plugin-proposal-class-properties",  "loose": true ],
  ],
  "presets": [
    "@babel/preset-typescript"
  ]

【讨论】:

我花了一整天的时间试图让 inversify 工作。你的回答救了我。 @AbdouOuahib 不客气。是的,这是非常绝望的情况:) 谢谢!我整天都在玩 babel 设置,这个简单的更改让它完美运行!

以上是关于Babel 7 + Inversify 4 + WebPack 4 - @inject 上的意外字符'@'的主要内容,如果未能解决你的问题,请参考以下文章

babel 7.x 结合 webpack 4.x 配置

无法使用 webpack 4 和 babel 7 导入 soap-npm 模块

babel@7 和 jest 配置

使用别名配置 Webpack 4,Babel 7 构建 React 组件库

babel 7.x 和 webpack 4.x 配置vue项目

如何升级到 babel 7