最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

webpack4 配置 ssr 環(huán)境遇到“document is not defined”

 更新時間:2019年10月24日 09:22:09   作者:zhengJX  
這篇文章主要介紹了webpack4 配置 ssr 環(huán)境遇到“document is not defined”,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

最近使用 webpack 4 配置 ssr 環(huán)境,發(fā)現(xiàn)的問題:

ReferenceError: document is not defined

本次package.json使用版本信息:

{
  "vue-loader": "^15.4.2",
  "mini-css-extract-plugin": "^0.4.3",
  "webpack": "^4.20.2",
  "webpack-cli": "^3.1.2"
  ...
}

相關(guān)代碼

問題原因:

在服務(wù)端渲染打包的配置中使用了mini-css-extract-plugin是的server bundle中會使用到document,node環(huán)境中不存在window對象,所以報錯。

解決辦法:

在webpack.base.config.js中不配置樣式相關(guān)的loader:

# 基本配置
const path = require('path')
const webpack = require('webpack')
const {VueLoaderPlugin} = require('vue-loader')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')

const resolve = dir => path.join(__dirname, '../', dir)
const isProd = process.env.NODE_ENV === 'production'

const base = {
 mode: isProd ? 'production' : 'development',
 devtool: isProd ? false : 'cheap-eval-source-map',
 output: {
  path: path.resolve(__dirname, '../dist'),
  publicPath: '/dist/',
  filename: '[name].[chunkhash].js'
 },
 resolve: {
  alias: {
   'vue$': 'vue/dist/vue.esm.js',
   'public': path.resolve(__dirname, '../public')
  }
 },
 module: {
  noParse: /es6-promise\.js$/, // avoid webpack shimming process
  rules: [
   {
    test: /\.vue$/,
    loader: 'vue-loader',
    include: resolve("src")
   },
   {
    test: /\.js$/,
    loader: 'babel-loader',
    exclude: file => (
     /node_modules/.test(file) && !/\.vue\.js/.test(file)
    )
   },
   {
    test: /\.(png|jpg|gif|svg)$/,
    loader: 'url-loader',
    options: {
     limit: 10000,
     name: '[name].[ext]?[hash]'
    }
   }
  ]
 },
 plugins: setPlugin()
}

function setPlugin() {
 const base = [new VueLoaderPlugin()]
 const dev = [new FriendlyErrorsPlugin()]
 const prod = []
 return base.concat(isProd ? prod : dev)
}

module.exports = base;

在webpack.client.config.js中使用mini-css-extract-plugin:

# 只展示先關(guān)配置
const webpack = require('webpack')
const merge = require('webpack-merge')
const base = require('./webpack.base.config')
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const VueSSRClientPlugin = require('vue-server-renderer/client-plugin')

const isProd = process.env.NODE_ENV === 'production'

const config = merge(base, {
 module: {
  rules: [
   {
    test: /\.styl(us)?$/,
    use: [
     isProd ? MiniCssExtractPlugin.loader : 'vue-style-loader',
     {
      loader: 'css-loader'
     },
     'stylus-loader'
    ],
   },
   {
    test: /\.(le|c)ss$/,
    use: [
     isProd ? MiniCssExtractPlugin.loader : 'vue-style-loader',
     {
      loader: 'css-loader'
     },
     'less-loader',
    ],
   }
  ]
 },
 plugins: [
  new MiniCssExtractPlugin({
   filename: isProd ? '[name].[chunkhash].css' : '[name].css',
   chunkFilename: isProd ? '[id].[chunkhash].css': '[id].css',
  }),
  new VueSSRClientPlugin()
 ]
})

module.exports = config

在webpack.server.config.js中不使用mini-css-extract-plugin:

# 只展示先關(guān)配置
const webpack = require('webpack')
const merge = require('webpack-merge')
const base = require('./webpack.base.config')
const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')

module.exports = merge(base, {
 target: 'node',
 module: {
  rules: [
   {
    test: /\.styl(us)?$/,
    use: [
     'vue-style-loader',
     {
      loader: 'css-loader'
     },
     'stylus-loader'
    ],
   },
   {
    test: /\.(le|c)ss$/,
    use: [
     'vue-style-loader',
     {
      loader: 'css-loader'
     },
     'less-loader',
    ],
   }
  ]
 },
 plugins: [
  new VueSSRServerPlugin()
 ]
})

參考Demo:

tiodot/vnews

相關(guān)issues:

vue-loader@15.0.0-rc.1 in a server bundle

webpack-contrib/mini-css-extract-plugin

結(jié)語:

由于本次webpack4版本比較新,周邊的插件沒能及時做出相應(yīng)更新;

相信經(jīng)過社區(qū)的不斷努力,整個生態(tài)會更加健壯。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JS如何實現(xiàn)手機端輸入驗證碼效果

    JS如何實現(xiàn)手機端輸入驗證碼效果

    這篇文章主要介紹了JS如何實現(xiàn)手機端輸入驗證碼效果,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 開箱即用的開源工具庫xijs示例詳解

    開箱即用的開源工具庫xijs示例詳解

    這篇文章主要為大家介紹了開箱即用的開源工具庫xijs示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • JavaScript實現(xiàn)多文件拖動上傳功能

    JavaScript實現(xiàn)多文件拖動上傳功能

    這篇文章主要為大家詳細介紹了如何使用JavaScript實現(xiàn)多文件拖動上傳功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • 微信小程序背景音樂開發(fā)詳解

    微信小程序背景音樂開發(fā)詳解

    這篇文章主要介紹了微信小程序背景音樂開發(fā)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JavaScript語句錯誤throw、try及catch實例解析

    JavaScript語句錯誤throw、try及catch實例解析

    這篇文章主要介紹了JavaScript語句錯誤throw、try及catch實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 用Javascript獲取頁面元素的具體位置

    用Javascript獲取頁面元素的具體位置

    制作網(wǎng)頁的過程中,你有時候需要知道某個元素在網(wǎng)頁上的確切位置,在接下來的文章中為大家介紹下使用js是如何實現(xiàn)的
    2013-12-12
  • 使用控制臺破解百小度一個月只準(zhǔn)改一次名字

    使用控制臺破解百小度一個月只準(zhǔn)改一次名字

    這篇文章主要介紹了使用控制臺破解百小度一個月只準(zhǔn)改一次名字的方法和代碼,有需要的小伙伴可以參考下。
    2015-08-08
  • 給Function做的OOP擴展

    給Function做的OOP擴展

    自編框架Megami的一部分……現(xiàn)在發(fā)現(xiàn)自己實在太宅了…… 文件中出現(xiàn)的名字請對號入座……
    2009-05-05
  • JavaScript中Promise的使用詳解

    JavaScript中Promise的使用詳解

    Promise,相信每一個前端工程師都或多或少地在項目中都是用過,畢竟它早已不是一個新名詞。ES6中已經(jīng)原生對它加以支持,在caniuse中搜索一下 Promise ,發(fā)現(xiàn)新版的chrome和firefox也已經(jīng)支持。但是低版本的瀏覽器我們可以使用 es6-promise 這個 polyfill 庫來加以兼容。
    2017-02-02
  • javascript框架設(shè)計讀書筆記之?dāng)?shù)組的擴展與修復(fù)

    javascript框架設(shè)計讀書筆記之?dāng)?shù)組的擴展與修復(fù)

    本文是司徒正美的《javascript框架設(shè)計》的第三章第2節(jié)的讀書筆記,本節(jié)主要介紹的是javascript數(shù)組的擴展與修復(fù),本文則是選取了其中的重點部分展示給大家。
    2014-12-12

最新評論

涟水县| 略阳县| 久治县| 天柱县| 石城县| 邻水| 上饶县| 通渭县| 通州区| 清河县| 临江市| 曲沃县| 页游| 杭锦旗| 遵化市| 紫阳县| 元江| 米泉市| 娄烦县| 洛川县| 桃园市| 新巴尔虎左旗| 镇康县| 卫辉市| 左云县| 平利县| 崇仁县| 靖边县| 翼城县| 剑川县| 黑水县| 鄂尔多斯市| 邯郸县| 冷水江市| 集贤县| 拉孜县| 铁岭市| 电白县| 武清区| 义马市| 怀柔区|