账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    使用webpack打包报错:Uncaught SyntaxError: Unexpected token <
    39
    0

    如题

    Uncaught SyntaxError: Unexpected token <
    
    Uncaught SyntaxError: Unexpected token <
    
    Uncaught SyntaxError: Unexpected token <

    webpack配置如下:
    base.js

    const webpack = require("webpack");
    const { resolve, join } = require("path");
    const HtmlWebpackPlugin = require("html-webpack-plugin"); //主要有两个作用:1、将打包后html文件引入script、link;2、创建一个模板页的html入口文件
    const CopyWebpackPlugin = require("copy-webpack-plugin"); // 在webpack中拷贝文件和文件夹
    const ExtractTextPlugin = require("extract-text-webpack-plugin");
    
    const CLIENT_FOLDER = resolve(__dirname, "./../");
    const SERVER_FOLDER = resolve(__dirname, "./../server");
    const nodeModulesPath = resolve(__dirname, "./../node_modules");
    
    let config = {
        devtool: "#cheap-module-eval-source-map", //默认模式,便于从打包后的文件中找到子文件
        entry: {
            "modules/admin": [
                "babel-polyfill",
                CLIENT_FOLDER + "/src/modules/admin/app"
            ],
            "modules/front": [
                "babel-polyfill",
                CLIENT_FOLDER + "/src/modules/front/entry-client"
            ]
        },
        output: { //这里的输入好像被覆盖了,等等回来看
            path: CLIENT_FOLDER + "/dist",
            filename: "[name].ymc.js",
            publicPath: "/"
        },
        externals: { //将编辑器模块排除
            simplemde: "SimpleMDE"
        },
        plugins: [],
        module: {
            rules: [
                {
                    test: /\.vue$/,
                    loader: "vue-loader",
                    options: {
                        loaders: {
                            less: [
                                "vue-style-loader",
                                "css-loader?minimize",
                                "less-loader"
                            ],
                            css: ["vue-style-loader", "css-loader?minimize"]
                        },
                        preserveWhitespace: false,//默认true,设置为 false,模版中 HTML 标签之间的空格将会被忽略
                        postcss: [
                            require("autoprefixer")({
                                browsers: ["last 7 versions"]
                            })
                        ]
                    }
                },
                {
                    test: /\.js[x]?$/,
                    loader: "babel-loader",
                    exclude: nodeModulesPath,
                    query: {
                        presets: ['es2015']
                    }
                },
                {
                    test: /\.less$/,
                    use: ["style-loader", "css-loader?minimize", "less-loader"]
                },
                {
                    test: /\.css$/,
                    use: ["style-loader", "css-loader?minimize"]
                },
                {
                    //对图片路径进行处理,超过小于10000转base64
                    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
                    loader: "url-loader",
                    options: {
                        limit: 10000,
                        name: "img/[name].[hash:7].[ext]"
                    }
                },
                {
                    test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
                    loader: "url-loader",
                    options: {
                        limit: 10000,
                        name: "fonts/[name].[hash:7].[ext]"
                    }
                }
            ]
        },
        resolve: {
            extensions: [".js", ".vue", ".json"],
            modules: [nodeModulesPath],
            alias: {//设置别名,简化路径!
                vue$: "vue/dist/vue.esm.js",
                vuex$: "vuex/dist/vuex.esm.js",
                "vue-router$": "vue-router/dist/vue-router.esm.js",
                simplemde$: "simplemde/dist/simplemde.min.js",
                "highlight.js$": "highlight.js/lib/highlight.js",
                fastclick: "fastclick/lib/fastclick.js",
    
            }
        },
        cache: true,//默认值,缓存webpack配置,提高打包速度
    };
    
    module.exports = config;
    

    pro.js

    const webpack = require("webpack");
    const merge = require("webpack-merge"); //合并webpack配置
    const { resolve, join } = require("path");
    const CopyWebpackPlugin = require("copy-webpack-plugin");
    const HtmlWebpackPlugin = require("html-webpack-plugin"); //设置Html模板文件的引入和配置
    const ExtractTextPlugin = require("extract-text-webpack-plugin"); //将css文件从js中单独抽离出来
    
    const base = require("./webpack.base.config"); //基础webpack配置文件
    const CLIENT_FOLDER = resolve(__dirname, "./../");
    const SERVER_FOLDER = resolve(__dirname, "./../server");
    const nodeModulesPath = resolve(__dirname, "./../node_modules");
    
    const productionEnv = process.env.NODE_ENV === "production" ? true : false;
    
    let config = merge(base, {
        plugins: [
            new webpack.HotModuleReplacementPlugin(),
            // 开启全局的模块热替换(HMR)
    
            new webpack.NamedModulesPlugin(),
            // 当模块热替换(HMR)时在浏览器控制台输出对用户更友好的模块名字信息,
            // 使模块呈现相对路径显示
    
            new HtmlWebpackPlugin({
                filename: "admin.html",
                template: CLIENT_FOLDER + "/src/modules/admin/index.html",
                inject: "body",//js文件防止的位置,默认true,参数:true、body、head、false
                chunks: productionEnv
                    ? [
                          "modules/manifest_admin",
                          "modules/vendor_admin",
                          "modules/admin"
                      ]
                    : ["modules/admin"],
                minify: {
                    // 压缩的方式;分别是移除注解、合并文档中的空白、删除可删除的引号
                    removeComments: true,
                    collapseWhitespace: true,
                    removeAttributeQuotes: true,
                }
                //chunksSortMode: 'dependency'//chunks的插入顺序
            }),
    
            new HtmlWebpackPlugin({
                filename: "front.html",
                template: CLIENT_FOLDER + "/src/modules/front/index.html",
                inject: 'body',
                chunks: productionEnv
                    ? [
                          "modules/manifest_front",
                          "modules/vendor_front",
                          "modules/front"
                      ]
                    : ["modules/front"],
                minify: {
                    // 压缩的方式
                    // removeComments: false,
                    collapseWhitespace: true,
                    removeAttributeQuotes: true,
                }
                //chunksSortMode: 'dependency'//决定了 script 标签的引用顺序;默认有四个选项,'none', 'auto',
            }),
            // 配置提取出的样式文件
            new ExtractTextPlugin("css/[name].[contenthash].css"),//contenthash是extraTextPlugin插件避免引用其css的文件改动,css文件也被重新构建,就是说不改动css,content文件是不会变的
    
            new webpack.DefinePlugin({//创建编译时的全局常量
                "process.env.NODE_ENV": JSON.stringify(
                    process.env.NODE_ENV || "development"
                ),
                "process.env.VUE_ENV": '"client"'
            })
        ]
    });
    config.entry["modules/admin"].unshift(
        "event-source-polyfill",
        "webpack-hot-middleware/client?reload=true"
    );
    config.entry["modules/front"].unshift(
        "event-source-polyfill",
        "webpack-hot-middleware/client?reload=true"
    );
    
    if (process.env.NODE_ENV === "production") {
        // 删除devtool
        delete config.devtool;
        // 删除webpack-hot-middleware
        config.entry["modules/admin"].splice(0, 2);
        config.entry["modules/front"].splice(0, 2);
        config.output.filename = "[name].[chunkhash:8].min.js";//重置输出目录
        // 提取css
        config.module.rules[0].options.loaders = {
            less:ExtractTextPlugin.extract({
                use: [
                    {
                        loader: "css-loader",
                        options: {
                            minimize: true,
                            sourceMap: true
                        }
                    },
                    {
                        loader: "less-loader",
                        options: {
                        }
                    }
                ],
                fallback: "vue-style-loader"
            }),
            css: ExtractTextPlugin.extract({
                use: [
                    {
                        loader: "css-loader",
                        options: {
                            minimize: true,
                            sourceMap: true
                        }
                    }
                ],
                fallback: "vue-style-loader"
            })
        };
        // 删除HotModuleReplacementPlugin和NamedModulesPlugin
        config.plugins.shift();
        config.plugins.shift();
        config.plugins = config.plugins.concat([
            new webpack.optimize.UglifyJsPlugin({
                // 最紧凑的输出
                beautify: false,
                // 删除所有的注释
                comments: false,
                compress: {
                    // 在UglifyJs删除没有用到的代码时不输出警告
                    warnings: false,
                    // 删除所有的 `console` 语句
                    // 还可以兼容ie浏览器
                    drop_console: true,
                    // 内嵌定义了但是只用到一次的变量
                    collapse_vars: true,
                    // 提取出出现多次但是没有定义成变量去引用的静态值
                    reduce_vars: true
                }
            }),
            // 分别提取vendor、manifest
            new webpack.optimize.CommonsChunkPlugin({
                name: "modules/vendor_admin",
                chunks: ["modules/admin"],
                minChunks: function(module, count) {
                    return (
                        module.resource &&
                        /\.js$/.test(module.resource) &&
                        module.resource.indexOf(nodeModulesPath) === 0
                    );
                }
            }),
            new webpack.optimize.CommonsChunkPlugin({
                name: "modules/manifest_admin",
                chunks: ["modules/vendor_admin"]
            }),
            new webpack.optimize.CommonsChunkPlugin({
                name: "modules/vendor_front",
                chunks: ["modules/front"],
                minChunks: function(module, count) {
                    return (
                        module.resource &&
                        /\.js$/.test(module.resource) &&
                        module.resource.indexOf(nodeModulesPath) === 0
                    );
                }
            }),
            new webpack.optimize.CommonsChunkPlugin({
                name: "modules/manifest_front",
                chunks: ["modules/vendor_front"]
            }),
            // copy static
            // new CopyWebpackPlugin([
            //     {
            //         from: CLIENT_FOLDER + "/static",
            //         to: CLIENT_FOLDER + "/dist/static",
            //         ignore: [".*"]
            //     }
            // ])
        ]);
    }
    // console.log(config);
    module.exports = config;
    
    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 我家g港有船 普通会员 1楼

      这个错误通常发生在使用JavaScript编译器解析JavaScript代码时。具体来说,当JavaScript代码中的"<"符号在处理时,编译器无法正确识别它是文本标签还是运算符。

      要解决这个问题,你需要确保你在使用JavaScript编译器时已经正确设置了解析选项。在webpack的配置文件中,你可以使用module.exports = { ...options }来设置解析选项。

      例如,如果你在配置文件中设置了module.exports = { parser: 'babel-loader' },那么JavaScript代码将被解析为ES6语法。如果你使用的是其他解析器,你可能需要相应地修改解析选项。

      此外,你还可以使用JavaScript的try...catch语句来捕获并处理这种错误。例如:

      javascript try { const code = 'var a = 1 &lt; 2;'; } catch (error) { console.error(error); }

      这段代码会捕获并处理JavaScript解析错误,输出错误信息。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部