F-loat / mpvue-entry

⛓️ 集中式页面配置,统一构建入口,支持新增页面热更新
MIT License
353 stars 56 forks source link

为什么我打包后报“未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。” #120

Closed zhoufanglu closed 5 years ago

zhoufanglu commented 5 years ago

按照readme.md流程来的 环境:mpvue2.0 项目是按照官网构建的。 pages:目录 image app.json image 有大佬看看吗? 报 image 打包后确实比以前小了30%

F-loat commented 5 years ago

pages 里写 vue 文件的路径

zhoufanglu commented 5 years ago

pages 里写 vue 文件的路径

pages 里写 vue 文件的路径

image 我这样写了, image 我改成这样了 但是还是报之前的错

F-loat commented 5 years ago

用我给的模板初始化一个项目,然后对比下看看

zhoufanglu commented 5 years ago

用我给的模板初始化一个项目,然后对比下看看

好的 我试试

zhoufanglu commented 5 years ago

用我给的模板初始化一个项目,然后对比下看看

webpack.base.conf.js

module.exports = {
  entry: MpvueEntry.getEntry("./src/app.json"),
  baseWebpackConfig:baseWebpackConfig,
  plugins: [
    new MpvueEntry(),
  ]
};

webpack.dev.conf.js

var baseWebpackConfig = require('./webpack.base.conf').baseWebpackConfig
...
...

以上是我webpack改动的配置。 我实在找不出有什么问题,方便的话看下。

F-loat commented 5 years ago

app.json 格式都一样吗

zhoufanglu commented 5 years ago

app.json image image 我dist下面没有生成app.json文件

F-loat commented 5 years ago

mpvue-entry 的版本是 2.x 吧

F-loat commented 5 years ago

或者你没有多平台需求的话,直接用我的模板也行

zhoufanglu commented 5 years ago

或者你没有多平台需求的话,直接用我的模板也行 后面需要发布h5版本。。。 "mpvue-entry": "^2.0.0-rc.9", 是2的版本。 npm run dev后直接没有app.json这个文件。 是不是我webpack的问题?

之前的页面是不是只需要保留vue文件,其他的可以删除? image

image ->打包后image 大佬帮忙看看,是不是webpack.dev.conf.js写错了?

F-loat commented 5 years ago

对,main.js 和 main.json 不需要保留,我有空用官方模板初始化试下

zhoufanglu commented 5 years ago

对,main.js 和 main.json 不需要保留,我有空用官方模板初始化试下

大佬,我感觉我的webpack出问题了,打包后少文件,我代码贴上来,麻烦看下,可能有点多。 我按照你模板改了下,但是都报插件的错,直接用你模板的webpack.conf也是一样的错。 image

var path = require('path')
var utils = require('./utils')
var config = require('../config')
var webpack = require('webpack')
var merge = require('webpack-merge')
var vueLoaderConfig = require('./vue-loader.conf')
var MpvuePlugin = require('webpack-mpvue-asset-plugin')
var CopyWebpackPlugin = require('copy-webpack-plugin')

const MpvueEntry = require('mpvue-entry')

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

/*function getEntry (rootSrc) {
  var map = {};
  glob.sync(rootSrc + '/pages/!**!/main.js')
  .forEach(file => {
    var key = relative(rootSrc, file).replace('.js', '');
    map[key] = file;
  })
   return map;
}

const appEntry = { app: resolve('./src/main.js') }
const pagesEntry = getEntry(resolve('./src'), 'pages/!**!/main.js')
const entry = Object.assign({}, appEntry, pagesEntry)*/

const entry = MpvueEntry.getEntry('./src/app.json')

let baseWebpackConfig = {
  // 如果要自定义生成的 dist 目录里面的文件路径,
  // 可以将 entry 写成 {'toPath': 'fromPath'} 的形式,
  // toPath 为相对于 dist 的路径, 例:index/demo,则生成的文件地址为 dist/index/demo.js
  entry,
  target: require('mpvue-webpack-target'),
  output: {
    path: config.build.assetsRoot,
    jsonpFunction: 'webpackJsonpMpvue',
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue': 'mpvue',
      '@': resolve('src')
    },
    symlinks: false,
    aliasFields: ['mpvue', 'weapp', 'browser'],
    mainFields: ['browser', 'module', 'main']
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'mpvue-loader',
        options: vueLoaderConfig
      },
      {
        test: /\.js$/,
        include: [resolve('src'), resolve('test')],
        use: [
          'babel-loader',
          {
            loader: 'mpvue-loader',
            options: Object.assign({checkMPEntry: true}, vueLoaderConfig)
          },
        ]
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[ext]')
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[ext]')
        }
      }
    ]
  },
  plugins: [
    // api 统一桥协议方案
    new webpack.DefinePlugin({
      'mpvue': 'global.mpvue',
      'mpvuePlatform': 'global.mpvuePlatform'
    }),
    new MpvuePlugin(),
    new MpvueEntry(),
    /*new CopyWebpackPlugin([{
      from: '**!/!*.json',
      to: ''
    }], {
      context: 'src/'
    }),*/
    new CopyWebpackPlugin([
      {
        from: path.resolve(__dirname, '../static'),
        to: path.resolve(config.build.assetsRoot, './static'),
        ignore: ['.*']
      }
    ])
  ]
}

// 针对百度小程序,由于不支持通过 miniprogramRoot 进行自定义构建完的文件的根路径
// 所以需要将项目根路径下面的 project.swan.json 拷贝到构建目录
// 然后百度开发者工具将 dist/swan 作为项目根目录打
const projectConfigMap = {
  tt: '../project.config.json',
  swan: '../project.swan.json'
}

const PLATFORM = process.env.PLATFORM
if (/^(swan)|(tt)$/.test(PLATFORM)) {
  baseWebpackConfig = merge(baseWebpackConfig, {
    plugins: [
      new CopyWebpackPlugin([{
        from: path.resolve(__dirname, projectConfigMap[PLATFORM]),
        to: path.resolve(config.build.assetsRoot)
      }])
    ]
  })
}

module.exports = baseWebpackConfig
F-loat commented 5 years ago

你的 main.js 方便发一下不

zhoufanglu commented 5 years ago

你的 main.js 方便发一下不

import Vue from 'vue'
import App from './App'
import store from './store/store'
//vant 组件
import Toast from '@/../static/vant/toast/toast';
import Dialog from '@/../static/vant/dialog/dialog';

import MpvueRouterPatch from 'mpvue-router-patch';//路由插件

Vue.use(MpvueRouterPatch)

import {get,post,put} from "./utils/http";
//在vue上绑定原型链
Vue.prototype.$get = get
Vue.prototype.$post = post
Vue.prototype.$put = put
Vue.prototype.$apiUser = 'tangxueqiang@ata.net.cn:Ata@1234'

Vue.prototype.$toast = Toast
/**
 * dialog 弹窗
 * @param title
 * @param text
 */
Vue.prototype.$alert = (title, text) => {
  Dialog.alert({
    title: title,
    message: text
  });
};

Vue.prototype.$store = store

Vue.config.productionTip = false
App.mpType = 'app'

//性能测试栈
//Vue.config._mpTrace = true

/*const app = new Vue(App)
app.$mount()*/

/*onTabItemTap(item)
{
  console.log(27, item)

  /!*wx.showToast({
    title: 'tab点击',
  })*!/
}*/

new Vue({
  store,
}).$mount()
zhoufanglu commented 5 years ago

大佬方便加我下qq吗,问题有点难解决。qq 1048813471 image 网上说加Page({}),我在main.js中加入Page({})后,又报这个错,网上方法解决不了。help image

F-loat commented 5 years ago

你们是需要多端支持吗,不如看看 uniapp ,uniapp 对其他端的支持度好一点吧

F-loat commented 5 years ago

你这个问题我今天不一定有时间看

F-loat commented 5 years ago

建议你简化下 main.js,把一些复杂操作提取到其他文件

zhoufanglu commented 5 years ago

你们是需要多端支持吗,不如看看 uniapp ,uniapp 对其他端的支持度好一点吧

这个项目就我一个前端,我这个项目已经差不多完成了(已经写了一个多月),就是想分个包,根据你那个模板改,然后报各种错了。

F-loat commented 5 years ago

只是要分包啊,官方的直接就可以的,在 app.json 里配置就行

zhoufanglu commented 5 years ago

只是要分包啊,官方的直接就可以的,在 app.json 里配置就行

但是我用了你的库,想看看到底哪里出问题了。。方便加qq吗,明天有空可以帮我看看吗? image

F-loat commented 5 years ago

我的 QQ 945852046

zhoufanglu commented 5 years ago

感谢作者回答~ 问题已经解决。 image

F-loat commented 5 years ago

mpvue-entry 会以 src/main.js 为模板生成各页面的 main.js,页面的 main.js 里必须传入 App 进行实例化才行