3.0vwe開發之webpack整合express

3.vwe中增加css和JavaScript

我們建立了服務器,輸入了地址可以顯示網頁,可是這遠遠不夠,我們需要CSS和JavaScript等等。
通常,我們要引入css或者JavaScript的時候,我們直接在html中通過路徑來引入就好了,但是在
webpack方式中,這是不行的(也許是我打開的方式不對)

那麼我們改怎麼引入呢?通過js,這可能和webpack的實現原理有關,webpack通過JavaScript來
編輯(通過各種loader來分析和加載),不論是css,file還是其他的,最後都被編譯到一個main.js中,最後,再通過html-webpack-plugin
注入到index.html中,所以我們需要一個可以用來注入前端的js,我們暫且叫他index.js,區別於
server.js

好了,現在總結下我們需要做什麼

  1. 用webpack打包前端
  2. 用webpack打包後端

打包需要config.js文件,所以我們需要兩個webpack.config.js,一個命名爲webpack.server.config.js
一個叫做webpack.config.js(這個可能會分爲兩個,一個用於Dev開發環境,一個用於prod生產環境,我們
暫時不管)。

安裝需要的依賴

npm install --save-dev css-loader file-loader style-loader

依賴分析:

  1. css-loader: css加載
  2. file-loader: 文件加載
  3. style-loader: html本地樣式加載

爲了讓代碼分類,我們把代碼放入相應的新建的src下的文件夾,當前目錄爲:

.babelrc
.git
.gitignore
README.md
dist
node_modules
package-lock.json
package.json
webpack.config.js
webpack.server.config.js
src
    index.js
    html
        index.html
    css
        style.css
    js
        index.js
    img
        awful-selfie.jpg
    server
        server.js

.git
.gitignore
README.md
這些文件可忽略,如果你不用git的話,readme的話也是可選的。在./src/html/index.html中填充我們需要顯示什麼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Express and Webpack App</title>
    <link rel="shortcut icon" href="#">
</head>
<body>
    <h1>Expack</h1>
    <p class="description">Express and Webpack Boilerplate App</p>
    <div class="awful-selfie"></div>
</body>
</html>

在./src/css/style.css中定義Application的樣式,style.css,代碼如下:

h1, h2, h3, h4, h5, p {
  font-family: helvetica;
  color: #3e3e3e;
}
.description {
  font-size: 14px;
  color: #9e9e9e;
}
.awful-selfie{
  background: url(../img/bg.jpg);
  width: 300px;
  height: 300px;
  background-size: 100% auto;
  background-repeat: no-repeat;
}

在./src/img/中放入名爲bg.jpg

在.src/中我們放入webpack.config.js中入口的前端js文件index.js,代碼如下:

import logMessage from './js/logger'
import './css/style.css'
// Log message to console
logMessage('Welcome to Expack!')

引入自定義的js,我們再./src/js中定義一般公共的js,這裏我們需要定義一個logger.js
代碼如下:

const logMessage = msg => console.log(msg)
export default logMessage

把root目錄下的server.js放在src/server中,這樣的話可以保持根目錄的簡潔和讓文件放在
合適的地方。

現在我們定義webpack.server.config.js,用作webpack打包服務器,代碼如下:

const path = require('path')
const webpack = require('webpack')
const nodeExternals = require('webpack-node-externals')
module.exports = {
  entry: {
    server: './src/server/server.js',
  },
  output: {
    path: path.join(__dirname, 'dist'),
    publicPath: '/',
    filename: '[name].js'
  },
  target: 'node',
  node: {
    // Need this when working with express, otherwise the build fails
    __dirname: false,   // if you don't put this is, __dirname
    __filename: false,  // and __filename return blank or /
  },
  externals: [nodeExternals()], // Need this to avoid error when working with Express
  module: {
    rules: [
      {
        // Transpiles ES6-8 into ES5
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  }
}

現在我們定義webpack前端的配置./webpack.config.js

const path = require("path")
const webpack = require('webpack')
const HtmlWebPackPlugin = require("html-webpack-plugin")
module.exports = {
  entry: {
    //注意這是入口,main而不是server屬性
    main: './src/index.js'
  },
  output: {
    path: path.join(__dirname, 'dist'),
    publicPath: '/',
    filename: '[name].js'
  },
  //這裏是web,不是node
  target: 'web',
  devtool: 'source-map',
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: "babel-loader",
      },
      {
        // Loads the javacript into html template provided.
        // Entry point is set below in HtmlWebPackPlugin in Plugins
        test: /\.html$/,
        use: [
          {
            loader: "html-loader",
            //options: { minimize: true }
          }
        ]
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      {
        test: /\.(png|svg|jpg|gif)$/,
        use: ['file-loader']
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/html/index.html",
      filename: "./index.html",
      excludeChunks: ['server']
    })
  ]
}

注意:
現在前段的webpack.config.js中的target是’web’,這樣重要的,如果是node的話
會出現錯誤。

好了,現在我們需要打包前端後後端,修改package.json中的腳本如下:

"scripts": {
  "build": "rm -rf dist && webpack --mode development --config webpack.server.config.js && webpack --mode development",
  "start": "node ./dist/server.js"
},

PS:windows 改成build腳本如下代碼

"build": "DEL /F /Q dist && webpack --mode development --config webpack.server.config.js && webpack --mode development",

最後,執行build腳本:

npm run build

應該可以成功,生成dist文件,如果沒有意外的話,應該有如下文件:

  1. xxxxxxx.jpg
  2. index.html
  3. main.js
  4. main.js.map
  5. server.js

啓動服務器

npm run start

運行結果如下:

App listening to 8080....
Press Ctrl+C to quit.

打開地址:http://localhost:8080/ ,正常的話,會出現有文字和圖片,conosole控制檯會出現welcome to webpack!

下一篇:3.1vwe開發之webpack整合express之開發環境和生產環境

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章