通过 Webpack 暴露全局 Vue 组件 [英] Global Vue Component Exposure via Webpack

查看:73
本文介绍了通过 Webpack 暴露全局 Vue 组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以基本上,我正在尝试为 MVC 项目创建一个混合结构.前端框架将由 Webpack 和 VueJS 管理.然而,经过数周的修补和与 Vue 一起学习正确的 Webpack 知识后,我一直无法实现我想要的.

所以上面是项目结构,但特别是 webpack 层.webpack文件夹首先会被Webpack打包到wwwroot/dist文件夹中,最终会是这样;

从这里,我们将能够将包导入到 MVC 视图的主布局中,然后我们可以将 Vue 内联应用于每个视图.这样做的目标是,我们可以首先,

  1. 使用 Webpack 捆绑样式和常用 js 库
  2. 能够利用 Vue 和 Vue 的组件,同时能够创建块结构(0.js、1、2 ....)
  3. 由于 2,我们将能够向 CSR(客户端渲染)倾斜.

这是我的 webpack.config.js 供参考.

const path = require('path');const webpack = require('webpack');const MergeIntoSingleFilePlugin = require('webpack-merge-and-include-globally');const UglifyJsPlugin = require('uglifyjs-webpack-plugin');const ExtractTextPlugin = require('extract-text-webpack-plugin');const extractCSS = new ExtractTextPlugin('bundle.css');//声明多个模块//https://stackoverflow.com/questions/16631064/declare-multiple-module-exports-in-node-jsmodule.exports = 函数(环境){环境 = 环境 ||{};var isProd = env.NODE_ENV === '生产';//为所有环境设置基本配置变量配置 = {入口: {主:'./Webpack/js/main'},输出: {//输出文件的格式文件名:'[名称].js',//将文件放入wwwroot/js/"路径:path.resolve(__dirname, 'wwwroot/dist/')},开发工具:'评估源地图',解决: {别名:{'vue': 'vue/dist/vue.esm.js'//使用完整构建},扩展名:['.js', '.jsx']},插件: [提取CSS,新的 webpack.ProvidePlugin({$: "jquery",jQuery: "jquery","window.jQuery": "jquery'","window.$": "jquery","dt": "datatables.net",波普尔:['popper.js','默认']}),新的 MergeIntoSingleFilePlugin({文件:{//表相关库tbl.js":['node_modules/datatables.net/js/jquery.dataTables.js','node_modules/datatables.net-bs4/js/dataTables.bootstrap4.js'],tbl.css":['node_modules/datatables.net-bs4/css/dataTables.bootstrap4.css','node_modules/datatables.net-buttons-bs4/css/buttons.bootstrap4.min.css'],双网.js":['Webpack/js/securo/Duo-Web-v2.js']}})],模块: {规则: [{ 测试:/\.css$/,使用:extractCSS.extract(['css-loader?minimize']) },{ 测试:/\.(png|jpg|jpeg|gif|svg)$/, 使用: 'url-loader?limit=25000' },{ 测试:/\.(png|woff|woff2|eot|ttf|svg)(\?|$)/, 使用: 'url-loader?limit=100000' },//识别VueJS{测试:/\.vue$/,loader: 'vue-loader'},//全局公开 jQuery//https://stackoverflow.com/questions/47469228/jquery-is-not-defined-using-webpack{测试:require.resolve('jquery'),用: [{装载机:'暴露装载机',选项:'jQuery'},{装载机:'暴露装载机',选项:'$'}]},{测试:require.resolve('bootbox'),用: [{装载机:'暴露装载机',选项:引导箱"}]},{测试:require.resolve('clipboard'),用: [{装载机:'暴露装载机',选项:剪贴板"}]},],装载机: [{测试:/\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,装载机:网址装载机"},{测试:/\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,装载机:网址装载机"},{测试:/\.vue$/,loader: 'vue-loader'}]}};//更改生产环境的配置如果(isProd){config.devtool = '源图';config.plugins = config.plugins.concat([新的 UglifyJsPlugin({源地图:真实}),//https://vuejs.org/v2/guide/deployment.html新的 webpack.DefinePlugin({'process.env':{NODE_ENV: '"生产"'}})]);}返回配置;};函数 toObject(路径){var ret = {};路径.forEach(函数(路径){ret[path.split('/').slice(-1)[0]] = path;});返回 ret;}

这里是 main.js

//先加载css导入 'bootstrap/dist/css/bootstrap.css';导入'../css/counter-ui.css';导入'../css/site.css';导入 'font-awesome/css/font-awesome.css';//然后js从'vue'导入Vue;//编译包含的构建 https://github.com/nuxt/nuxt.js/issues/1142导入'jquery';导入'jquery-validation';导入'jquery-validation-unobtrusive';导入'popper.js';导入引导程序";导入引导日期选择器";导入引导箱";导入剪贴板";导入'magicsuggest';进口'nouislider';导入'../js/counter-ui.js';导入'formcache';//Vue 组件Vue.component(/* webpackChunkName: "base-select" */'base-select', () => import('./components/base-select.vue'));//全局暴露Vue//https://stackoverflow.com/questions/45388795/uncaught-referenceerror-vue-is-not-defined-when-put-vue-setting-in-index-html窗口.Vue = Vue;$(函数(){$('.datepicker').datepicker();$('.dropdown-toggle').dropdown();$('[data-toggle="popover"]').popover({动画:真实,});});//数组重复过滤器//https://stackoverflow.com/questions/6940103/how-do-i-make-an-array-with-unique-elements-i-e-remove-duplicates函数 OmitArrDupes(a) {var temp = {};for (var i = 0; i < a.length; i++)temp[a[i]] = 真;var r = [];for (var k in temp)r.push(k);返回 r;}

如您所见,webpack 仅用于捆绑常用库和样式,同时,它用于存储 Vue 和我将要制作的组件,并帮助完成所有繁琐的工作.

>

你最终会得到:

这就是你如何能像我一样陷入困境,或者就我所知,像我一样愚蠢.在将其用于生产用途后,我正在变成一个退化者.

根据 chrome 上的控制台错误判断,0.js 已加载但由于组件方面的原因中止.那么究竟是怎么回事呢?我真的很想知道这实际上是如何工作的.以前从未如此深入地了解前端.

EDIT 这可能是由于组件的语法.可能是错的?嗯.. 但如果是这样的话,Webpack 就没有话题了.