javascript - JSON 中位置 0 错误的意外标记 m

标签 javascript json token aurelia loader

在编译应用程序并尝试使用 webpack 实现 i18n 库时,我遇到了这个错误:

ERROR in ./node_modules/bundle-loader?lazy&name=lang-pt!./src/locales/pt/translation.json
Module parse failed: Unexpected token m in JSON at position 0
You may need an appropriate loader to handle this file type.
SyntaxError: Unexpected token m in JSON at position 0
    at JSON.parse (<anonymous>)
    at JsonParser.parse (C:\Users\vasco.bento\ContactosWebPack\node_modules\webpack\lib\JsonParser.js:15:21)
    at doBuild.err (C:\Users\vasco.bento\ContactosWebPack\node_modules\webpack\lib\NormalModule.js:367:32)
    at runLoaders (C:\Users\vasco.bento\ContactosWebPack\node_modules\webpack\lib\NormalModule.js:264:12)
    at C:\Users\vasco.bento\ContactosWebPack\node_modules\loader-runner\lib\LoaderRunner.js:370:3
    at iterateNormalLoaders (C:\Users\vasco.bento\ContactosWebPack\node_modules\loader-runner\lib\LoaderRunner.js:211:10)
    at C:\Users\vasco.bento\ContactosWebPack\node_modules\loader-runner\lib\LoaderRunner.js:183:6
    at runSyncOrAsync (C:\Users\vasco.bento\ContactosWebPack\node_modules\loader-runner\lib\LoaderRunner.js:130:11)
    at C:\Users\vasco.bento\ContactosWebPack\node_modules\loader-runner\lib\LoaderRunner.js:175:3
    at loadLoader (C:\Users\vasco.bento\ContactosWebPack\node_modules\loader-runner\lib\loadLoader.js:36:3)
    at iteratePitchingLoaders (C:\Users\vasco.bento\ContactosWebPack\node_modules\loader-runner\lib\LoaderRunner.js:169:2)
    at runLoaders (C:\Users\vasco.bento\ContactosWebPack\node_modules\loader-runner\lib\LoaderRunner.js:362:2)
    at NormalModule.doBuild (C:\Users\vasco.bento\ContactosWebPack\node_modules\webpack\lib\NormalModule.js:219:3)
    at NormalModule.build (C:\Users\vasco.bento\ContactosWebPack\node_modules\webpack\lib\NormalModule.js:337:15)
    at Compilation.buildModule (C:\Users\vasco.bento\ContactosWebPack\node_modules\webpack\lib\Compilation.js:346:10)
    at factory.create (C:\Users\vasco.bento\ContactosWebPack\node_modules\webpack\lib\Compilation.js:572:15)
 @ ./node_modules/aurelia-i18n/dist/native-modules/aurelia-i18n.js
 @ ./src/main.js
 @ ./node_modules/aurelia-webpack-plugin/runtime/empty-entry.js
 @ multi aurelia-webpack-plugin/runtime/empty-entry aurelia-webpack-plugin/runtime/pal-loader-entry aurelia-bootstrapper

ERROR in chunk app [entry]
[name].[hash].bundle.js
Cannot read property 'replace' of undefined

这对我在 locales 文件夹中的其他语言重复此操作,该文件夹正确放置在 src 文件夹中,即使 JSON 文件完全为空,也会出现相同的错误。

这是 webconfig.js 文件:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const project = require('./aurelia_project/aurelia.json');
const {
    AureliaPlugin,
    ModuleDependenciesPlugin
} = require('aurelia-webpack-plugin');
const {
    ProvidePlugin
} = require('webpack');
const {
    BundleAnalyzerPlugin
} = require('webpack-bundle-analyzer');

// config helpers:
const ensureArray = (config) => config && (Array.isArray(config) ? config : [config]) || [];
const when = (condition, config, negativeConfig) =>
    condition ? ensureArray(config) : ensureArray(negativeConfig);

// primary config:
const title = 'Aurelia Navigation Skeleton';
const outDir = path.resolve(__dirname, project.platform.output);
const srcDir = path.resolve(__dirname, 'src');
const nodeModulesDir = path.resolve(__dirname, 'node_modules');
const baseUrl = '/';

const cssRules = [{
    loader: 'css-loader'
}];

module.exports = ({
    production,
    server,
    extractCss,
    coverage,
    analyze
} = {}) => ({
    resolve: {
        extensions: ['.js'],
        modules: [srcDir, 'node_modules']
    },
    entry: {
        app: ['aurelia-bootstrapper'],
        vendor: ['bluebird']
    },
    mode: production ? 'production' : 'development',
    output: {
        path: outDir,
        publicPath: baseUrl,
        filename: production ? '[name].[chunkhash].bundle.js' : '[name].[hash].bundle.js',
        sourceMapFilename: production ? '[name].[chunkhash].bundle.map' : '[name].[hash].bundle.map',
        chunkFilename: production ? '[name].[chunkhash].chunk.js' : '[name].[hash].chunk.js'
    },
    performance: {
        hints: false
    },
    devServer: {
        contentBase: outDir,
        // serve index.html for all 404 (required for push-state)
        historyApiFallback: true
    },
    devtool: production ? 'nosources-source-map' : 'cheap-module-eval-source-map',
    module: {
        rules: [
            // CSS required in JS/TS files should use the style-loader that auto-injects it into the website
            // only when the issuer is a .js/.ts file, so the loaders are not applied inside html templates
            {
                test: /\.css$/i,
                issuer: [{
                    not: [{
                        test: /\.html$/i
                    }]
                }],
                use: extractCss ? ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: cssRules
                }) : ['style-loader', ...cssRules]
            },
            {
                test: /\.css$/i,
                issuer: [{
                    test: /\.html$/i
                }],
                // CSS required in templates cannot be extracted safely
                // because Aurelia would try to require it again in runtime
                use: cssRules
            },
            {
                test: /\.html$/i,
                loader: 'html-loader'
            },
            {
                test: /\.js$/i,
                loader: 'babel-loader',
                exclude: nodeModulesDir,
                options: coverage ? {
                    sourceMap: 'inline',
                    plugins: ['istanbul']
                } : {}
            },
            {
                test: /\.json$/i,
                loader: 'json-loader'
            },
            // use Bluebird as the global Promise implementation:
            {
                test: /[\/\\]node_modules[\/\\]bluebird[\/\\].+\.js$/,
                loader: 'expose-loader?Promise'
            },
            // embed small images and fonts as Data Urls and larger ones as files:
            {
                test: /\.(png|gif|jpg|cur)$/i,
                loader: 'url-loader',
                options: {
                    limit: 8192
                }
            },
            {
                test: /\.woff2(\?v=[0-9]\.[0-9]\.[0-9])?$/i,
                loader: 'url-loader',
                options: {
                    limit: 10000,
                    mimetype: 'application/font-woff2'
                }
            },
            {
                test: /\.woff(\?v=[0-9]\.[0-9]\.[0-9])?$/i,
                loader: 'url-loader',
                options: {
                    limit: 10000,
                    mimetype: 'application/font-woff'
                }
            },
            // load these fonts normally, as files:
            {
                test: /\.(ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/i,
                loader: 'file-loader'
            }
        ]
    },
    plugins: [
        new AureliaPlugin(),
        new ProvidePlugin({
            'Promise': 'bluebird'
        }),
        new ModuleDependenciesPlugin({
            'aurelia-testing': ['./compile-spy', './view-spy'],
            'aurelia-i18n': [{
                name: 'locales/en/translation.json',
                chunk: 'lang-en'
            }, {
                name: 'locales/pt/translation.json',
                chunk: 'lang-pt'
            }]
        }),
        new HtmlWebpackPlugin({
            template: 'index.ejs',
            minify: production ? {
                removeComments: true,
                collapseWhitespace: true
            } : undefined,
            metadata: {
                // available in index.ejs //
                title,
                server,
                baseUrl
            }
        }),
        ...when(extractCss, new ExtractTextPlugin({
            filename: production ? '[contenthash].css' : '[id].css',
            allChunks: true
        })),
        ...when(production, new CopyWebpackPlugin([{
            from: 'static/favicon.ico',
            to: 'favicon.ico'
        }])),
        ...when(analyze, new BundleAnalyzerPlugin())
    ]
});

上面代码中的问题发生在

{
                test: /\.json$/i,
                loader: 'json-loader'
            },

如果你发表评论,让应用程序编译没有问题,我已经搜索过,但尽管我发现了与此类似的问题,但我还没有找到可行的解决方案,如果有人对我的方法有任何建议解决这个问题我将不胜感激。

提前致谢。

最佳答案

它说 unexpected token m 的原因是因为 json-loader 将您的 json 转换为以 module.exports = .. 开头的 javascript 文件。

当然这不是有效的 json(json 必须始终以左大括号 {)开头,因此它会唠叨“模块”的“m”。

换句话说,这个错误表明 webpack 试图连续两次应用 json-loader。将 json-loader 更改为 raw-loader 应该摆脱 webpack 的包装器 javascript,并将 json 按原样传递给可能试图将其作为原始 json 加载的任何其他插件。

这里有一个相关的问题可能会帮助您解决这个问题:

https://github.com/webpack-contrib/json-loader/issues/13

关于javascript - JSON 中位置 0 错误的意外标记 m,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49501723/

相关文章:

Python JSON解码

iOS 企业开发者账号 : get device token

mysql - 使用bindParam的pdo更新显示绑定(bind)变量数量与 token 数量不匹配的错误

javascript - 使用 Javascript 在 Qualtrics 中延迟显示文本

Javascript 无法在一个页面上加载,但在另一页面上工作正常

javascript - Google map 图 block 未在 Bootstrap-Modal 中加载

javascript - IE10 - 如何在网络开发工具的响应体中显示json格式

javascript - 主干 - 内置 REST 功能

javascript - 使用 jQuery 提交表单时的竞争条件

javascript - 为多个客户端渲染 html View