lavas-project / vue-skeleton-webpack-plugin

Lavas webpack plugin: skeleton solution for PWA webshell
886 stars 129 forks source link

E:\git\my-vue-scaffold\node_modules\memory-fs\lib\MemoryFileSystem.js:114 throw new MemoryFileSystemError(errors.code.ENOENT, _path); ^ Error: no such file or directory #4

Closed xiaobinwu closed 6 years ago

xiaobinwu commented 6 years ago

引入vue-skeleton-webpack-plugin插件,执行,却报memory-fs读取不到文件,显示file不存在,排查了一下最终生成的webpack.skeleton.conf生成的对象,如下: { target: 'node', devtool: false, entry: './src/skeleton/foo/entry-skeleton.js', output: { path: 'E:\\git\\my-vue-scaffold\\dist', libraryTarget: 'commonjs2', filename: 'skeleton-foo.js' }, resolve: { extensions: [ '.js', '.json', '.vue', '.scss', '.css' ], alias: { '~': 'E:\\git\\my-vue-scaffold\\src', 'vue$': 'vue/dist/vue.esm.js' }, modules: [ 'E:\\git\\my-vue-scaffold\\src', 'node_modules' ] }, module: { rules: [ [Object], [Object], [Object] ] }, externals: [Function], plugins: [ ExtractTextPlugin { filename: 'skeleton-foo.css', id: 2, options: {} } ] }, 以及打印出outputPathoutputCssPath,如下: E:\git\my-vue-scaffold\dist\skeleton-foo.js E:\git\my-vue-scaffold\dist\skeleton-foo.css, 感觉没什么问题为什么还会报这错呢,作者有空的话帮忙解惑一下呢。 github地址: https://github.com/xiaobinwu/my-vue-scaffold

xiaobinwu commented 6 years ago

srr.js 文件var serverCompiler = webpack(serverWebpackConfig, (err, stats) => { if (err || stats.hasErrors()) { console.log(err) } console.log('success') }); 打印出来的是success

bundle也能获取得到

node -v v6.11.3

npm -v 3.10.10

xiaobinwu commented 6 years ago

webpack.skeleton.config.js

const { resolve } = require('path') const nodeExternals = require('webpack-node-externals') const ExtractTextPlugin = require("extract-text-webpack-plugin") const glob = require('glob') const entryJsList = {} const entries = glob.sync('./src/skeleton/*/entry-skeleton.js') for (const path of entries) { const chunkName = path.slice('./src/skeleton/'.length, -'/entry-skeleton.js'.length) entryJsList[chunkName] = resolve(__dirname, path) }

console.log(entryJsList)

module.exports = { target: 'node', devtool: false, entry: entryJsList, output: { path: resolve(dirname, 'dist'), filename: 'static/js/[name].js', libraryTarget: 'commonjs2' }, resolve: { extensions: ['.js', '.json', '.vue'], alias: { '~': resolve(dirname, 'src'), vue$: 'vue/dist/vue.esm.js' } }, module: { rules: [ { enforce: 'pre', test: /.vue$/, loader: 'eslint-loader', exclude: /node_modules/ }, { test: /.js$/, exclude: /node_modules/, use: ['babel-loader', 'eslint-loader'] }, { test: /.vue$/, loader: 'vue-loader', options: { loaders: { sass: ExtractTextPlugin.extract({ use: 'css-loader!sass-loader', fallback: 'vue-style-loader' }) } } } ] }, externals: nodeExternals({ whitelist: /.css$/ }), plugins: [] }

xiaobinwu commented 6 years ago

解决了呢

xiaoiver commented 6 years ago

CSS 样式文件是用 ExtractWebpackPlugin 从 JS 里提取出来的。而这个插件根据 Webpack 宿主环境 2.x或者3.x 也有两个对应的版本 2.x.x 和 3.x.x。 所以我们这个插件也需要根据项目的 Webpack 版本选择 0.x.x(Webpack 2) 或者 1.x.x(Webpack 3)。

否则可能存在以下的问题: 原项目已经安装了 2.x.x 的 ExtractWebpackPlugin,而安装这个插件时又安装了 3.x.x 的ExtractWebpackPlugin。这样两个版本的依赖同时存在,从 MemoryFS 里就找不着样式文件了。

不过这是插件早期存在的问题,现在通过 package.json 的 peerDependencies,安装插件时发现不匹配是会在控制台给出提示的。

jiangjunfeng98 commented 6 years ago

@xiaobinwu 我也遇到一样的问题了,你怎么解决的呢? 按照作者给出的提示没搞定

huangyingwen commented 6 years ago

按照作者提示,还是没有搞定 ├── autoprefixer@7.1.6 ├── axios@0.17.1 ├── babel-core@6.26.0 ├── babel-eslint@8.0.2 ├── babel-helper-vue-jsx-merge-props@2.0.2 ├── babel-loader@7.1.2 ├── babel-plugin-component@0.10.1 ├── babel-plugin-istanbul@4.1.5 ├── babel-plugin-syntax-jsx@6.18.0 ├── babel-plugin-transform-runtime@6.23.0 ├── babel-plugin-transform-vue-jsx@3.5.0 ├── babel-preset-env@1.6.1 ├── babel-preset-stage-2@6.24.1 ├── babel-register@6.26.0 ├── babel-runtime@6.26.0 ├── chai@4.1.2 ├── chalk@2.3.0 ├── chromedriver@2.33.2 ├── clipboard@1.7.1 ├── connect-history-api-fallback@1.5.0 ├── copy-webpack-plugin@4.2.3 ├── cross-env@5.1.1 ├── cross-spawn@5.1.0 ├── css-loader@0.28.7 ├── cssnano@3.10.0 ├── eslint@4.12.0 ├── eslint-config-standard@10.2.1 ├── eslint-friendly-formatter@3.0.0 ├── eslint-loader@1.9.0 ├── eslint-plugin-html@3.2.2 ├── eslint-plugin-import@2.8.0 ├── eslint-plugin-node@5.2.1 ├── eslint-plugin-promise@3.6.0 ├── eslint-plugin-standard@3.0.1 ├── eventsource-polyfill@0.9.6 ├── express@4.16.2 ├── extract-text-webpack-plugin@3.0.2 ├── fastclick@1.0.6 ├── file-loader@1.1.5 ├── friendly-errors-webpack-plugin@1.6.1 ├── html-webpack-plugin@2.30.1 ├── html2canvas@0.5.0-beta4 ├── http-proxy-middleware@0.17.4 ├── inject-loader@3.0.1 ├── inobounce@0.1.5 ├── iscroll@5.2.0 ├── karma@1.7.1 ├── karma-coverage@1.1.1 ├── karma-mocha@1.3.0 ├── karma-phantomjs-launcher@1.0.4 ├── karma-phantomjs-shim@1.5.0 ├── karma-sinon-chai@1.3.3 ├── karma-sourcemap-loader@0.3.7 ├── karma-spec-reporter@0.0.31 ├── karma-webpack@2.0.6 ├── lodash@4.17.4 ├── mint-ui@2.2.11 ├── mocha@4.0.1 ├── nightwatch@0.9.16 ├── node-sass@4.7.2 ├── normalize-scss@7.0.0 ├── normalizr@3.2.4 ├── opn@5.1.0 ├── optimize-css-assets-webpack-plugin@3.2.0 ├── ora@1.3.0 ├── phantomjs-prebuilt@2.1.16 ├── postcss-px2rem@0.3.0 ├── qrcode@1.0.0 ├── rimraf@2.6.2 ├── sass-loader@6.0.6 ├── selenium-server@3.7.1 ├── semver@5.4.1 ├── shelljs@0.7.8 ├── sinon@4.1.2 ├── sinon-chai@2.14.0 ├── svg-sprite-loader@3.4.1 ├── svgo@1.0.3 ├── svgo-loader@2.1.0 ├── sw-precache-webpack-plugin@0.11.4 ├── uglify-es@3.2.0 ├── url-loader@0.6.2 ├── vue@2.5.8 ├── vue-lazyload@1.1.4 ├── vue-loader@13.5.0 ├── vue-router@3.0.1 ├── vue-skeleton-webpack-plugin@1.1.7 ├── vue-style-loader@3.0.3 ├── vue-template-compiler@2.5.8 ├── vuex@3.0.1 ├── vuex-router-sync@5.0.0 ├── webpack@3.8.1 ├── webpack-bundle-analyzer@2.9.1 ├── webpack-dev-middleware@1.12.1 ├── webpack-hot-middleware@2.21.0 ├── webpack-merge@4.1.1 ├── webpack-node-externals@1.6.0 └── weixin-js-sdk@1.2.0

huangyingwen commented 6 years ago

这个问题已经解决了,如果用 vue-cli 模板配置,注意把 vue-loader.conf.js 修改下,启用 ExtractTextPlugin



const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'

module.exports = {
  loaders: utils.cssLoaders({
    sourceMap: isProduction
      ? config.build.productionSourceMap
      : config.dev.cssSourceMap,
    // extract: isProduction
    extract: true
  }),
  transformToRequire: {
    video: 'src',
    source: 'src',
    img: 'src',
    image: 'xlink:href'
  }
}
huangyingwen commented 6 years ago

基于 vue-cli 配置,skeleton 会一闪而过,不知道什么原因

huangyingwen commented 6 years ago

我知道什么原因了,服务渲染挂载需要修改

/* eslint-disable no-new */
// new Vue({
//   el: '#app',
//   router,
//   store,
//   loading,
//   template: '<App/>',
//   components: {
//     App
//   }
// })

let app = new Vue({
  router,
  store,
  loading,
  ...App
})

router.onReady(() => {
  store.commit('iniIsandroid')
  store.commit('initClientHeight')
  app.$mount('#app')
})
huangyingwen commented 6 years ago

@jiangjunfeng98 把 vue-loader.conf.js 修改下,我上面已经回复了