├── .babelrc ├── .fecsignore ├── .gitignore ├── .postcssrc.js ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── examples ├── index.js ├── multi-skeleton │ ├── index.html │ ├── src │ │ ├── Skeleton1.vue │ │ ├── Skeleton2.vue │ │ ├── entry-skeleton.js │ │ └── entry.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ └── webpack.config.js ├── multipage │ ├── README.md │ ├── index.html │ ├── src │ │ └── pages │ │ │ ├── page1 │ │ │ ├── Page1.skeleton.vue │ │ │ ├── entry-skeleton.js │ │ │ └── entry.js │ │ │ └── page2 │ │ │ ├── Page2.skeleton.vue │ │ │ ├── entry-skeleton.js │ │ │ └── entry.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ └── webpack.config.js ├── multipage2 │ ├── README.md │ ├── src │ │ └── pages │ │ │ ├── page1 │ │ │ ├── Page1.skeleton.vue │ │ │ ├── entry-skeleton.js │ │ │ ├── entry.js │ │ │ └── index.html │ │ │ └── page2 │ │ │ ├── Page2.skeleton.vue │ │ │ ├── entry-skeleton.js │ │ │ ├── entry.js │ │ │ └── index.html │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ └── webpack.config.js ├── multipage3 │ ├── README.md │ ├── src │ │ └── pages │ │ │ ├── page1 │ │ │ ├── Page1.skeleton.vue │ │ │ ├── entry-skeleton.js │ │ │ ├── entry.js │ │ │ └── index.html │ │ │ └── page2 │ │ │ ├── entry.js │ │ │ └── index.html │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ └── webpack.config.js ├── simple │ ├── .browserslistrc │ ├── .postcssrc.js │ ├── index.html │ ├── src │ │ ├── Skeleton.vue │ │ ├── entry-skeleton.js │ │ ├── entry.js │ │ ├── logo.jpg │ │ └── main.css │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ └── webpack.config.js ├── vue-cli3 │ ├── .browserslistrc │ ├── .gitignore │ ├── package.json │ ├── postcss.config.js │ ├── public │ │ ├── favicon.ico │ │ └── index.html │ ├── src │ │ ├── App.vue │ │ ├── Skeleton.vue │ │ ├── assets │ │ │ └── logo.png │ │ ├── components │ │ │ └── HelloWorld.vue │ │ ├── main.js │ │ └── skeleton.js │ └── vue.config.js └── webpack4 │ ├── .browserslistrc │ ├── .postcssrc.js │ ├── index.html │ ├── src │ ├── Skeleton.vue │ ├── entry-skeleton.js │ ├── entry.js │ ├── logo.jpg │ └── main.css │ ├── utils.js │ ├── webpack.base.conf.js │ └── webpack.config.js ├── package.json ├── src ├── index.js ├── loader.js ├── ssr.js └── util.js └── test ├── loader.test.js ├── multi-skeleton.test.js ├── multipage.test.js ├── multipage2.test.js ├── multipage3.test.js ├── simple.test.js ├── utils.js └── webpack4.test.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "env", 5 | { 6 | "targets": { 7 | "node": 4 8 | } 9 | } 10 | ] 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /.fecsignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | lib 4 | npm-debug.log* 5 | coverage 6 | .nyc_output 7 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | 'autoprefixer': {} 4 | } 5 | }; 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - stable 4 | - lts/* 5 | - 6.9 6 | env: 7 | - WEBPACK_VERSION=3 VUE_LOADER_VERSION=^14.0.0 8 | - WEBPACK_VERSION=4 VUE_LOADER_VERSION=^15.0.0 9 | install: 10 | - npm install --ignore-scripts 11 | - npm rm webpack 12 | - npm rm vue-loader 13 | - npm install webpack@$WEBPACK_VERSION vue-loader@$VUE_LOADER_VERSION --ignore-scripts || true 14 | script: 15 | - npm test -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Change History 2 | ============== 3 | 4 | ======= 5 | v1.2.2 6 | --- 7 | * [Feature] `insertAfter` 支持传入自定义 `Function` [ISSUE#26](https://github.com/lavas-project/vue-skeleton-webpack-plugin/issues/26) 8 | 9 | v1.2.1 10 | --- 11 | * [Feature] 支持 hot reload, 原有 `SkeletonWebpackPlugin.loader` 已废弃 12 | * [Fix] #38 13 | 14 | v1.1.18 15 | --- 16 | * [Feature] 支持 Webpack 4 #13 17 | * [Fix] #23 18 | 19 | v1.1.17 20 | --- 21 | * [Fix] 修复 cssExtract 带来的问题。 22 | 23 | v1.1.16 24 | --- 25 | * [Fix] 紧急修复 `entry` 传入数组导致编译失败的问题。 26 | 27 | v1.1.14 28 | --- 29 | * [Feature] 简化 `webpackConfig` 配置项,不需要提供完整的 webpack 配置对象,只需要包含 `entry` 指向 `entry-skeleton.js` 即可。 30 | 31 | v1.1.12 32 | --- 33 | * [Fix] [ISSUE#15](https://github.com/lavas-project/vue-skeleton-webpack-plugin/issues/15) 34 | 35 | v1.1.9 36 | --- 37 | * [Feature] 支持 SPA 下多个路由路径拥有各自的 Skeleton 38 | 39 | v1.1.8 40 | --- 41 | * [Fix] 针对`entry`名称中包含连字符的情况,增加`[nameHash]`占位符 42 | 43 | v1.1.7 44 | --- 45 | * [Fix] 由于不是所有编辑器都在文件末尾自动添加空行。Loader 为路由文件添加 import 语句时插入换行符。[ISSUE#5](https://github.com/lavas-project/vue-skeleton-webpack-plugin/issues/5) 46 | 47 | v1.1.6 48 | --- 49 | * [Feature] 支持新参数 quiet,在服务端渲染时是否需要输出信息到控制台 50 | * [Fix] 服务端渲染组件完成后,自动关闭 webpack 对内存文件系统的监听 51 | 52 | v1.1.4 53 | --- 54 | * 支持 webpack 3.0.0 以上,修复了不填写 entry 名称导致的 bug 55 | 56 | v1.1.2 57 | --- 58 | * 增加多页应用开发模式下,自动插入各个页面skeleton对应的路由 59 | * 增加loader多种参数配置 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | vue-skeleton-webpack-plugin 2 | =================== 3 | 4 | [](https://badge.fury.io/js/vue-skeleton-webpack-plugin) 5 | [](https://travis-ci.org/lavas-project/vue-skeleton-webpack-plugin) 6 | 7 | [](https://nodei.co/npm/vue-skeleton-webpack-plugin/) 8 | 9 | 这是一个基于 Vue 的 webpack 插件,为单页/多页应用生成骨架屏 skeleton,减少白屏时间,在页面完全渲染之前提升用户感知体验。 10 | 11 | 支持 webpack@3 和 webpack@4,支持 Hot reload。 12 | 13 | ## 基本实现 14 | 15 | 参考了[饿了么的 PWA 升级实践](https://huangxuan.me/2017/07/12/upgrading-eleme-to-pwa/)一文, 16 | 使用服务端渲染在构建时渲染 skeleton 组件,将 DOM 和样式内联到最终输出的 html 中。 17 | 18 | 另外,为了开发时调试方便,会将对应路由写入`router.js`中,可通过`/skeleton`路由访问。 19 | 20 | 插件具体实现可参考[我的这篇文章](https://xiaoiver.github.io/coding/2017/07/30/%E4%B8%BAvue%E9%A1%B9%E7%9B%AE%E6%B7%BB%E5%8A%A0%E9%AA%A8%E6%9E%B6%E5%B1%8F.html) 21 | 22 | ## 使用方法 23 | 24 | 安装: 25 | ```bash 26 | npm install vue-skeleton-webpack-plugin 27 | ``` 28 | 29 | 运行测试用例: 30 | ```bash 31 | npm run test 32 | ``` 33 | 34 | 在 webpack 中引入插件: 35 | ```js 36 | // webpack.conf.js 37 | import SkeletonWebpackPlugin from 'vue-skeleton-webpack-plugin'; 38 | 39 | plugins: [ 40 | new SkeletonWebpackPlugin({ 41 | webpackConfig: { 42 | entry: { 43 | app: resolve('./src/entry-skeleton.js') 44 | } 45 | } 46 | }) 47 | ] 48 | ``` 49 | 50 | ## 参数说明 51 | 52 | ### SkeletonWebpackPlugin 53 | 54 | - webpackConfig *必填*,渲染 skeleton 的 webpack 配置对象 55 | - insertAfter *选填*,渲染 DOM 结果插入位置,默认值为字符串 `'
5 | For guide and recipes on how to configure / customize this project,
6 | check out the
7 | vue-cli documentation.
8 |