国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Vue+thinkJs博客網(wǎng)站(一)之vue多頁面應(yīng)用的webpack3配置

dongxiawu / 2921人閱讀

摘要:首先看下的代碼編譯前刪除之前編譯生成的靜態(tài)資源首先需要改的是入口文件,因?yàn)槭嵌囗撁鎽?yīng)用,需要多個(gè)入口文件來保證打包成不同的。

一.項(xiàng)目簡介

? ? 本項(xiàng)目使用vue作為前端框架,thinkJs作為后端框架,構(gòu)建個(gè)人博客網(wǎng)站,頁面分為博客展示和后臺(tái)管理,主要目的是學(xué)習(xí)使用thinkJs。現(xiàn)在只完成了主要的博客增刪改功能,發(fā)現(xiàn)webpack的配置遇到了一些坑,這里先記錄下。項(xiàng)目目錄結(jié)構(gòu)如下:

其中system文件夾是前端vue項(xiàng)目的代碼,博客展示頁面與后臺(tái)管理頁面都在這里,打包成兩個(gè)頁面,具體webpack配置是本文重點(diǎn)。項(xiàng)目地址在這

二.搭建過程

安裝nodejs后,首先安裝thinkjs

npm install -g think-cli;
thinkjs new self_blog;
npm install;
npm start;

這樣thinkJs項(xiàng)目初步搭建完成了,接下來創(chuàng)建vue項(xiàng)目。項(xiàng)目根目錄下新建文件夾system。

npm install -g vue-cli
vue init webpack self_blog
cd self_blog
npm install
npm run dev

這樣vue項(xiàng)目初步搭建完畢,接下來講下這里vue的具體webpack配置。

三.webpack配置

項(xiàng)目前端頁面分為博客的展示和后臺(tái)管理,這里的思路是將sytem的src下面放后臺(tái)管理頁面,在sytem下新建blog文件夾,放前臺(tái)展示頁面,打包時(shí)生成兩個(gè)html,實(shí)現(xiàn)webpack打包多頁面應(yīng)用。目錄如下:

1.webpack.base.conf.js的配置

使用vue-cli創(chuàng)建項(xiàng)目,npm run dev運(yùn)行開發(fā)環(huán)境,會(huì)使用webpack-dev-server作為前端服務(wù)器,從而實(shí)現(xiàn)熱加載。這樣打包的文件只會(huì)在內(nèi)存里,這里我的思路是直接生成到thinkJs項(xiàng)目的view目錄下,通過服務(wù)端的路由返回給前端。這樣只用啟動(dòng)后端的服務(wù)就行了,因?yàn)槲募呀?jīng)打包到服務(wù)端,前端也不存在跨域訪問后端的問題了。所以這里就不需要配置devServer了,而是改變html與js等靜態(tài)資源的生成目錄。首先看下webpack.base.conf.js的代碼:

"use strict";
const path = require("path");
const utils = require("./utils");
const config = require("../config");
const vueLoaderConfig = require("./vue-loader.conf");
const webpack = require("webpack");
const baseFileName = require("../package.json").name;
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const cleanWebpackPlugin = require("clean-webpack-plugin");
const AssetsPlugin = require("assets-webpack-plugin");
function resolve(dir) {
  return path.join(__dirname, "..", dir);
}

module.exports = {
  context: path.resolve(__dirname, "../"),
  entry: {
    app: "./src/main.js",
    blog: "./blog/index.js"
  },
  output: {
    path: config.build.assetsRoot,
    filename: "[name].js",
    publicPath:
      process.env.NODE_ENV === "production"
        ? config.build.assetsPublicPath
        : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: [".js", ".vue", ".json"],
    alias: {
      vue$: "vue/dist/vue.esm.js",
      "@": resolve("src")
    }
  },
  externals: {
    vue: "Vue",
    "vue-router": "VueRouter",
    echarts: "echarts",
    ElementUI: "element-ui"
  },
  module: {
    rules: [
      {
        test: /.vue$/,
        loader: "vue-loader",
        options: vueLoaderConfig
      },
      {
        test: /.js$/,
        loader: "babel-loader",
        include: [
          resolve("src"),
          resolve("test"),
          resolve("node_modules/webpack-dev-server/client")
        ]
      },
      {
        test: /.(png|jpe?g|gif|svg)(?.*)?$/,
        loader: "url-loader",
        exclude: [resolve("src/icons")],
        options: {
          limit: 10000,
          name: utils.assetsPath(baseFileName + "/img/[name].[hash:7].[ext]")
        }
      },
      {
        test: /.svg$/,
        loader: "svg-sprite-loader",
        include: [resolve("src")],
        options: {
          symbolId: "icon-[name]"
        }
      },
      {
        test: /.(mp4|webm|ogg|mp3|wav|flac|aac)(?.*)?$/,
        loader: "url-loader",
        options: {
          limit: 10000,
          name: utils.assetsPath(baseFileName + "/media/[name].[hash:7].[ext]")
        }
      },
      {
        test: /.(woff2?|eot|ttf|otf)(?.*)?$/,
        loader: "url-loader",
        options: {
          limit: 10000,
          name: utils.assetsPath(baseFileName + "/fonts/[name].[hash:7].[ext]")
        }
      }
    ]
  },
  plugins: [
    new AssetsPlugin({
      filename: "build/webpack.assets.js",
      processOutput: function(assets) {
        return "window.WEBPACK_ASSETS=" + JSON.stringify(assets);
      }
    }),
    new webpack.optimize.CommonsChunkPlugin({
      name: "vendor",
      minChunks: function(module) {
        return (
          module.resource &&
          /.js$/.test(module.resource) &&
          module.resource.indexOf(path.join(__dirname, "../node_modules")) === 0
        );
      }
    }),
    new webpack.optimize.CommonsChunkPlugin({
      name: "manifest",
      minChunks: Infinity
    }),
    new ExtractTextPlugin({
      filename: utils.assetsPath(
        baseFileName + "/css/[name].[contenthash].css"
      ),
      allChunks: true
    }),
    // 編譯前刪除之前編譯生成的靜態(tài)資源
    new cleanWebpackPlugin(["www/static/self_blog", "view/blog"], {
      root: resolve("../")
    })
  ],
  node: {
    setImmediate: false,
    dgram: "empty",
    fs: "empty",
    net: "empty",
    tls: "empty",
    child_process: "empty"
  }
};

首先需要改的是入口文件,因?yàn)槭嵌囗撁鎽?yīng)用,需要多個(gè)入口文件來保證打包成不同的chunk。我們知道正常vue-cli創(chuàng)建的但頁面應(yīng)用,會(huì)打包成三個(gè)chunk,分別是vendor.js(第三方依賴),manifest.js(異步加載的實(shí)現(xiàn)),app.js(業(yè)務(wù)代碼)。這里新增一個(gè)入口文件,打包時(shí)就會(huì)生成名為blog.js的chunk,含有前臺(tái)展示頁面的js業(yè)務(wù)代碼。

這里新增使用的clean-webpack-plugin,是為了每次編譯后,刪除之前生成的js,css等靜態(tài)資源,否則因?yàn)檫@些資源不重名,就會(huì)一直堆在你生成的目錄下。

此外一些第三方依賴,vue,elementUI什么的,我使用了cdn引入,這樣打包時(shí)這些依賴不會(huì)打進(jìn)去,進(jìn)而減小的vendor.js的體積。具體做法就是配置里的externals定義這些依賴,然后在生成html的模板里用script標(biāo)簽直接引入cdn里的js。

注意一下,如果你開發(fā)時(shí)想用vue-devtool,需要引入vue.js,如果不用就引入vue.min.js。

2.webpack.dev.conf.js的配置

先看下代碼:

"use strict";
const utils = require("./utils");
const webpack = require("webpack");
const config = require("../config");
const merge = require("webpack-merge");
const path = require("path");
const baseWebpackConfig = require("./webpack.base.conf");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const FriendlyErrorsPlugin = require("friendly-errors-webpack-plugin");
const portfinder = require("portfinder");

const HOST = process.env.HOST;
const PORT = process.env.PORT && Number(process.env.PORT);
const baseFileName = require("../package.json").name;
function resolve(dir) {
  return path.join(__dirname, "..", dir);
}
const devWebpackConfig = merge(baseWebpackConfig, {
  module: {
    rules: utils.styleLoaders({
      sourceMap: config.dev.cssSourceMap,
      extract: true,
      usePostCSS: true
    })
  },
  // cheap-module-eval-source-map is faster for development
  devtool: config.dev.devtool,
  output: {
    path: resolve(config.dev.assetsRoot),
    filename: "static/" + baseFileName + "/js/[name]-[hash:5].js",
    chunkFilename: "static/" + baseFileName + "/js/[name]-[id:5].js"
  },

  plugins: [
    new webpack.DefinePlugin({
      "process.env": require("../config/dev.env")
    }),
    // new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
    new webpack.NoEmitOnErrorsPlugin(),
    // https://github.com/ampedandwired/html-webpack-plugin
    new HtmlWebpackPlugin({
      filename: resolve(`../view/blog/index_index.html`),
      template: "./view/index.html",
      title: "博客管理系統(tǒng)",
      favicon: resolve("favicon.ico"),
      inject: true,
      chunks: ["manifest", "vendor", "app"]
    }),
    new HtmlWebpackPlugin({
      filename: resolve(`../view/blog/blog_index.html`),
      template: "./view/blog.html",
      title: "博客展示",
      inject: true,
      chunks: ["manifest", "vendor", "blog"]
    }),
    // copy custom static assets
    new CopyWebpackPlugin([
      {
        from: path.resolve(__dirname, "../static"),
        to: config.dev.assetsSubDirectory,
        ignore: [".*"]
      }
    ])
  ]
});
module.exports = devWebpackConfig;

這里我刪掉了之前默認(rèn)配置的devSever,以及module.exports直接導(dǎo)出devWebpackConfig。此外,因?yàn)榇虬赡夸浀淖兓倚薷牧薿utput里面的path,filename,chunkFilename。使他們生成到self_blog根目錄的www/static下面,這也是thinkJs靜態(tài)資源的默認(rèn)目錄。需要注意下,filename指的是你的出口文件(app),以及通過codespliting生成的js(vendor,manifest)的文件名;chunkFilename定義的是一些懶加載組件打包后的js文件名。

下面需要添加的就是html-webpack-plugin,因?yàn)樾枰虬蓛蓚€(gè)html,所以使用兩次這個(gè)插件。除了定義生成文件名(filename),html模板(template)等,還需要定義你這個(gè)html需要的chunk,這是跟單頁面配置的一個(gè)區(qū)別。

除此之外,如果你想要開發(fā)環(huán)境打包時(shí)就分離出css,那么在使用utils.styleLoaders時(shí),將extract置為true。因?yàn)檫@里的方法判斷是開發(fā)環(huán)境才使用extract-text-plugin抽離css。

3.webpack.prod.conf.js的配置

prod的配置與dev差不多,生成文件目錄也沒變,只不過多了一些js,css壓縮插件。

"use strict";
const path = require("path");
const utils = require("./utils");
const webpack = require("webpack");
const config = require("../config");
const merge = require("webpack-merge");
const baseWebpackConfig = require("./webpack.base.conf");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const OptimizeCSSPlugin = require("optimize-css-assets-webpack-plugin");
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const baseFileName = require("../package.json").name;
const env = require("../config/prod.env");
function resolve(dir) {
  return path.join(__dirname, "..", dir);
}
const webpackConfig = merge(baseWebpackConfig, {
  entry: {
    app: "./entry/entry-client-index",
    blog: "./entry/entry-client-blog"
  },
  module: {
    rules: utils.styleLoaders({
      sourceMap: config.build.productionSourceMap,
      extract: true,
      usePostCSS: true
    })
  },
  devtool: config.build.productionSourceMap ? config.build.devtool : false,
  output: {
    path: resolve(config.dev.assetsRoot),
    filename: "static/" + baseFileName + "/js/[name]-[chunkhash:5].js",
    chunkFilename: "static/" + baseFileName + "/js/[name]-[chunkhash:5].js"
  },
  plugins: [
    new webpack.DefinePlugin({
      "process.env": require("../config/prod.env"),
      "process.env.VUE_ENV": ""client""
    }),
    new UglifyJsPlugin({
      uglifyOptions: {
        compress: {
          warnings: false
        }
      },
      sourceMap: config.build.productionSourceMap,
      parallel: true
    }),
    new webpack.optimize.OccurrenceOrderPlugin(),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    }),
    // extract css into its own file
    new ExtractTextPlugin({
      filename: utils.assetsPath(
        baseFileName + "/css/[name].[contenthash].css"
      ),
      allChunks: true
    }),
    new HtmlWebpackPlugin({
      minify: {},
      chunksSortMode: "dependency",
      environment: process.env.NODE_ENV,
      filename: resolve(`../view/blog/index_index.html`),
      template: "./view/index.html",
      title: "博客管理系統(tǒng)",
      favicon: resolve("favicon.ico"),
      inject: true,
      chunks: ["manifest", "vendor", "app"]
    }),
    new HtmlWebpackPlugin({
      filename: resolve(`../view/blog/blog_index.html`),
      template: "./view/blog.html",
      title: "博客展示",
      favicon: resolve("favicon.ico"),
      inject: true,
      chunks: ["manifest", "vendor", "blog"]
    }),
    // Compress extracted CSS. We are using this plugin so that possible
    // duplicated CSS from different components can be deduped.
    new OptimizeCSSPlugin({
      cssProcessorOptions: config.build.productionSourceMap
        ? { safe: true, map: { inline: false } }
        : { safe: true }
    }),
   
  ]
});

if (config.build.productionGzip) {
  const CompressionWebpackPlugin = require("compression-webpack-plugin");

  webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: "[path].gz[query]",
      algorithm: "gzip",
      test: new RegExp(
        ".(" + config.build.productionGzipExtensions.join("|") + ")$"
      ),
      threshold: 10240,
      minRatio: 0.8
    })
  );
}

if (config.build.bundleAnalyzerReport) {
  const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")
    .BundleAnalyzerPlugin;
  webpackConfig.plugins.push(new BundleAnalyzerPlugin());
}

module.exports = webpackConfig;

四.總結(jié)

具體可以看github上的代碼

本次項(xiàng)目主要目的是練習(xí)thinkJs,這里先把前期webpack配置方面的東西簡單說下,下一篇將會(huì)仔細(xì)講下thinkJs的使用方法和特性。項(xiàng)目會(huì)繼續(xù)更新,不少東西還沒做完呢。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/53744.html

相關(guān)文章

  • Vue+thinkJs博客網(wǎng)站vue頁面應(yīng)用webpack3配置

    摘要:首先看下的代碼編譯前刪除之前編譯生成的靜態(tài)資源首先需要改的是入口文件,因?yàn)槭嵌囗撁鎽?yīng)用,需要多個(gè)入口文件來保證打包成不同的。 一.項(xiàng)目簡介 ? ? 本項(xiàng)目使用vue作為前端框架,thinkJs作為后端框架,構(gòu)建個(gè)人博客網(wǎng)站,頁面分為博客展示和后臺(tái)管理,主要目的是學(xué)習(xí)使用thinkJs。現(xiàn)在只完成了主要的博客增刪改功能,發(fā)現(xiàn)webpack的配置遇到了一些坑,這里先記錄下。項(xiàng)目目錄結(jié)構(gòu)如下...

    NickZhou 評(píng)論0 收藏0
  • Vue+thinkJs博客網(wǎng)站(二)thinkJs使用

    摘要:插件機(jī)制可以說是自定義的鉤子函數(shù)。首先在新建文件夾,新建文件以為例更新內(nèi)容緩存里對應(yīng)的數(shù)組表示鉤子函數(shù)的調(diào)用名,具體調(diào)用的是下面的方法。 一.簡介 這個(gè)個(gè)人博客網(wǎng)站最初制作的目的就是練習(xí)使用thinkJs,這一篇就主要講一下thinkJs的一些特性和注意事項(xiàng)。涉及到了文件上傳,thinkJs的插件機(jī)制,model層建立以及CURD的編寫方式等。本項(xiàng)目github地址在這里。 項(xiàng)目thi...

    lucas 評(píng)論0 收藏0
  • Vue+thinkJs博客網(wǎng)站(二)thinkJs使用

    摘要:插件機(jī)制可以說是自定義的鉤子函數(shù)。首先在新建文件夾,新建文件以為例更新內(nèi)容緩存里對應(yīng)的數(shù)組表示鉤子函數(shù)的調(diào)用名,具體調(diào)用的是下面的方法。 一.簡介 這個(gè)個(gè)人博客網(wǎng)站最初制作的目的就是練習(xí)使用thinkJs,這一篇就主要講一下thinkJs的一些特性和注意事項(xiàng)。涉及到了文件上傳,thinkJs的插件機(jī)制,model層建立以及CURD的編寫方式等。本項(xiàng)目github地址在這里。 項(xiàng)目thi...

    _Suqin 評(píng)論0 收藏0
  • Vue+thinkJs博客網(wǎng)站(二)thinkJs使用

    摘要:插件機(jī)制可以說是自定義的鉤子函數(shù)。首先在新建文件夾,新建文件以為例更新內(nèi)容緩存里對應(yīng)的數(shù)組表示鉤子函數(shù)的調(diào)用名,具體調(diào)用的是下面的方法。 一.簡介 這個(gè)個(gè)人博客網(wǎng)站最初制作的目的就是練習(xí)使用thinkJs,這一篇就主要講一下thinkJs的一些特性和注意事項(xiàng)。涉及到了文件上傳,thinkJs的插件機(jī)制,model層建立以及CURD的編寫方式等。本項(xiàng)目github地址在這里。 項(xiàng)目thi...

    desdik 評(píng)論0 收藏0
  • 使用 vue + thinkjs 開發(fā)博客程序記錄

    摘要:一入冬懶癌發(fā)作,給自己找點(diǎn)事干。之前博客程序?qū)戇^幾次,的寫過兩次,用寫過,隨著版本從升級(jí)到之前的博客程序也做過升級(jí)。這里主要記錄一下開發(fā)過程中遇到的問題和解決方法。后端使用守護(hù)進(jìn)程即可。 一入冬懶癌發(fā)作,給自己找點(diǎn)事干。之前博客程序?qū)戇^幾次,php 的寫過兩次,nodejs 用 ThinkJS 寫過,隨著 ThinkJS 版本從1.x 升級(jí)到 2.x 之前的博客程序也做過升級(jí)。但是因?yàn)?..

    Mike617 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<