成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從搭建腳手架到在npm上發(fā)布react組件

junfeng777 / 1133人閱讀

摘要:從搭建腳手架到在上發(fā)布組件最近公司給公司里架設(shè)了私有的倉庫,相應(yīng)地也需要一個用來發(fā)布組件用的腳手架,在這個過程中又又又又復(fù)習(xí)了一下,在這里分享下腳手架搭建的過程。

從搭建腳手架到在npm上發(fā)布react組件

最近公司給公司里架設(shè)了私有的npm倉庫,相應(yīng)地也需要一個用來發(fā)布react組件用的腳手架,在這個過程中又又又又復(fù)習(xí)了一下webpack,在這里分享下腳手架搭建的過程。

首先,我們預(yù)期的腳手架具有如下功能

開發(fā)組件時可以實(shí)時預(yù)覽

對組件各種資源進(jìn)行打包(js/css/圖片等)

一鍵打包發(fā)布

1.創(chuàng)建項(xiàng)目

腳手架的名字暫時取react-simple-component-boilerplate。

首先創(chuàng)建一個新目錄用于放我們的文件:

mkdir react-simple-component-boilerplate
cd react-simple-component-boilerplate

使用npm命令創(chuàng)建一個項(xiàng)目

npm init

接下來會提示你輸入項(xiàng)目的名稱、版本號、作者等,也可以一路回車,稍后修改。
這一步完成后,你的項(xiàng)目文件夾里應(yīng)該有一個package.json文件了,這個文件保存了我們項(xiàng)目和組件的各種信息。

接下來創(chuàng)建如下的目錄結(jié)構(gòu)

react-simple-component-boilerplate
    |-- config // webpack配置
    |-- demo    // 開發(fā)時預(yù)覽用
    |-- dist    // 打包結(jié)果
    |-- src     // 源文件目錄
        | -- assets // 存放圖片等媒體文件
        | -- style    // 存放樣式,項(xiàng)目使用的是less來編寫樣式
2.安裝依賴

既然我們要發(fā)布的是react組件,那依賴?yán)锟隙ㄉ俨涣藃eact。
使用npm install安裝下面的依賴

npm install react react-dom --save

打包工具選擇的是webpack,下面是開發(fā)依賴,也需要一并安裝

  "devDependencies": {
    // babel用于將你寫的es6+的代碼轉(zhuǎn)換到es5
    "@babel/cli": "^7.0.0",
    "@babel/core": "^7.0.0",
    "@babel/plugin-proposal-class-properties": "^7.0.0", // 用于支持class屬性
    "@babel/plugin-proposal-decorators": "^7.0.0", // 支持decorator
    "@babel/plugin-transform-modules-commonjs": "^7.0.0",
    "@babel/plugin-transform-runtime": "^7.0.0", // 自動polyfill es5不支持的api特性
    "@babel/preset-env": "^7.0.0", // 根據(jù)目標(biāo)環(huán)境來按需轉(zhuǎn)碼
    "@babel/preset-react": "^7.0.0", // 讓babel支持react語法
    "babel-loader": "^8.0.0",
    "css-loader": "^1.0.0",
    "file-loader": "^2.0.0",
    "html-loader": "^0.4.4",
    "less-loader": "^4.1.0", // 使用less來編寫樣式
    "mini-css-extract-plugin": "^0.5.0", // 將css提取成一個多帶帶的文件
    "style-loader": "^0.23.0",
    "webpack": "^4.26.0",
    "webpack-cli": "^3.1.2", // webpack4之后需要額外安裝webpack-cli
    "webpack-dev-server": "^3.1.14", // 開發(fā)時預(yù)覽組件所用的服務(wù),在文件變化時會自動刷新頁面
    "webpack-merge": "^4.1.4" // 用于合并webpack配置
  },
3.編寫組件

/src目錄下新建一個index.js,這就是我們組件的入口文件了。
如果項(xiàng)目中要使用圖片、css等,分類放到assetsstyle文件夾下就好。

下面我們就在index.js中寫一個簡單的組件

/* src/index.js */

import React from "react";
import "./style/style.less"; // 使用less的情況
import testPng from "./assets/test.png"; // 使用圖片的情況

export default class MyComponent extends Component {
    render(){
        return (
A new Component
) } }

接下來,我們在/demo目錄下新建index.htmldemo.js這兩個文件用于在開發(fā)組件時預(yù)覽組件效果。
index.html內(nèi)容如下




    
    Title


demo.js中,我們要使用一下剛剛寫的組件(位于/src/index.js)看一下效果,開發(fā)中這個demo.js文件會被打包成demo.bundle.js,就是在上面index.html中引用的js。

import React from "react";
import ReactDom from "react-dom";
import MyComponent from "../src/index"

const Demo  = () => {
  return 

組件預(yù)覽:

} ReactDom.render(, document.getElementById("root"));
4.配置webpack和babel

4.1 配置webpack

/config下我們建立三個webpack配置文件

webpack.base.js

webpack.config.dev.js // 開發(fā)時的配置

webpack.config.prod.js // 打包發(fā)布時的配置

由于開發(fā)和發(fā)布打包時webpack的配置有一部分是公共而且重復(fù)的,我們把這部分的配置多帶帶拿出來放到webpack.base.js中。
首先是公共配置webpack.base.js:

module.exports = {
  module: {
    rules: [
      { // 在webpack中使用babel需要babel-loader
        test: /.js?$/,
        loader: "babel-loader",
        exclude: "/node_modules/",
      },
      { // 用于加載組件或者css中使用的圖片
        test: /.(jpg|jpeg|png|gif|cur|ico|svg)$/,
        use: [{
          loader: "file-loader", options: {
            name: "images/[name][hash:8].[ext]"
          }
        }]
      }
    ]
  }
}

下面是開發(fā)時所用的webpack配置,寫在webpack.config.dev.js

const path = require("path");
const merge = require("webpack-merge");
const baseConfig = require("./webpack.base.js"); // 引用公共的配置

const devConfig = {
  entry: "./demo/demo.js", // 入口文件
  mode: "development", // 打包為開發(fā)模式
  output: {
    filename: "demo.bundle.js", // 輸出的文件名稱
    path: path.resolve(__dirname, "../demo") // 輸出的文件目錄
  },
  devServer: { // 該字段用于配置webpack-dev-server
    contentBase: path.join(__dirname, "../demo"),
    compress: true,
    port: 9000, // 端口9000
    open: true // 自動打開瀏覽器
  },
  module: {
    rules: [
      { // 編譯less
        test: /.less$/,
        exclude: "/node_modules/",
        use: [{
          loader: "style-loader"
        }, {
          loader: "css-loader"
        }, {
          loader: "less-loader"
        }]
      },
    ]
  },
}

module.exports = merge(devConfig, baseConfig); // 將baseConfig和devConfig合并為一個配置

需要注意的是,等會使用webpack-dev-sevrer啟動開發(fā)服務(wù)時,并不會實(shí)際在demo文件夾下生成demo.bundle.js,打包好的文件是在內(nèi)存中的,但并不影響我們使用。

下面是打包發(fā)布時所用的webpack配置,寫在webpack.config.prod.js

const path = require("path");
const merge = require("webpack-merge");
const baseConfig = require("./webpack.base.js");
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 用于將組件的css打包成多帶帶的文件輸出到`dist`目錄中

const devConfig = {
  entry: "./src/index.js",
  mode: "production",
  output: {
    path: path.resolve(__dirname, "../dist"),
    filename: "index.js", // 輸出文件
    libraryTarget: "umd", // 采用通用模塊定義, 注意webpack到4.0為止依然不提供輸出es module的方法,所以輸出的結(jié)果必須使用npm安裝到node_modules里再用,不然會報(bào)錯
    library: "react-simple-component-boilerplate", // 庫名稱
    libraryExport: "default", // 兼容 ES6(ES2015) 的模塊系統(tǒng)、CommonJS 和 AMD 模塊規(guī)范
  },
  externals: {
    react: {
      root: "React",
      commonjs2: "react",
      commonjs: "react",
      amd: "react"
    },
    "react-dom": {
      root: "ReactDOM",
      commonjs2: "react-dom",
      commonjs: "react-dom",
      amd: "react-dom"
    }
  },
  module: {
    rules: [{
      test: /.(le|c)ss$/,
      use: [
        MiniCssExtractPlugin.loader,
        "css-loader",
        {
          loader: "less-loader",
          options: {
            sourceMap: false
          }
        }
      ]
    }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "main.min.css" // 提取后的css的文件名
    })
  ],
}

module.exports = merge(devConfig, baseConfig);

上面我們配置了externals字段,這一點(diǎn)非常重要。
externals定義了外部依賴。將react和react-dom添加進(jìn)該字段,說明我們的組件將依賴外部的react和react-dom,這樣就可以避免把react和react-dom打包進(jìn)去(不然組件會很大)

4.1 配置babel
我們需要用babel把我們的代碼編譯成es5版本。在項(xiàng)目根目錄新建一個.babelrc文件,輸入以下內(nèi)容。

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": "> 0.25%, not dead"
      }
    ],
    "@babel/preset-react"
  ],
  "plugins": [
    "@babel/plugin-transform-runtime",
    "@babel/plugin-transform-modules-commonjs",
    [
      "@babel/plugin-proposal-decorators",
      {
        "legacy": true
      }
    ],
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-proposal-object-rest-spread"
  ]
}

我們在presets其中使用了preset-env, 規(guī)定了輸出的代碼目標(biāo)環(huán)境是份額大于0.25%的瀏覽器。另外由于我們的項(xiàng)目里使用了react,presets中就要加入preset-react。
同時,plugins配置了一些babel插件,用于支持裝飾器展開操作符等類內(nèi)直接定義屬性等新的es特性。

4.3 配置啟動命令
我們再次回到項(xiàng)目根目錄下的package.json中,編輯如下

  "scripts": {
    "build": "set NODE_ENV=production && webpack --config ./config/webpack.config.prod.js",
    "pub": "npm run build && npm publish",
    "dev": "webpack-dev-server --config ./config/webpack.config.dev.js"
  },
  "main": "dist/index.js",
  "files": ["dist"]

build 命令用于打包組件

dev 命令會使用webpack-dev-server啟動一個開發(fā)服務(wù)用于預(yù)覽組件效果

pub 命令進(jìn)行打包組件并且發(fā)布到npm上

main字段指定了我們的組件的入口文件,files字段用于指定我們的npm包的文件目錄。

5.試用和發(fā)布

要發(fā)布一個npm包,我們需使用如下命令添加一個npm的賬號,如果已經(jīng)添加過的這一步可以跳過。

npm adduser

如果已經(jīng)有npm賬號,可以使用npm login登陸。
如果不知道自己是否已經(jīng)添加過了npm賬號,使用npm whoami查看登陸信息即可

接下來就編輯package.json把組件的名稱/版本/介紹等字段都填寫一下。

好了,接下我們先使用npm run dev命令,此時會自動打開默認(rèn)瀏覽器預(yù)覽組件。
如果沒什么問題的話,接下來使用npm run pub進(jìn)行打包和發(fā)布。
等待發(fā)布完成后,我們就下載安裝一下。

npm i your-component // 假設(shè)你的包名字叫your-component

使用自己發(fā)布的組件

import YourComponent from "your-component";
import "your-component/dist/main.min.css"; // 如果給組件寫了樣式,需要手動導(dǎo)入css文件
6.總結(jié)

到這里,一個非常非常簡單的用于發(fā)布react小組件的腳手架就搭好了,總結(jié)一下其中要注意的地方:

webpack打包時libraryTarget要使用umd

externals 里要把外部依賴配置好

如果還要生成es module,可以額外使用gulp或rollup等工具

webpack4 之后建議使用MiniCssExtractPlugin來提取css

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100845.html

相關(guān)文章

  • 簡易手架搭建

    摘要:總結(jié)以上就是一個簡單腳手架的實(shí)現(xiàn)方式,后期也會一直去更新和維護(hù)這個腳手架,公司現(xiàn)在新的項(xiàng)目就是基于這個腳手架去搭建的,因?yàn)楣粳F(xiàn)在的項(xiàng)目都是寫的,所以的功能暫時不支持,后期也會慢慢支持 寫在最前面 隨著公司業(yè)務(wù)的發(fā)展,獨(dú)立的系統(tǒng)也慢慢多了起來,腳手架的必要性也日趨明顯。 基于此,便開始搭起了腳手架,主要解決兩個問題: 1.項(xiàng)目的反復(fù)配置 2.公共組件的自動更新 代碼地址點(diǎn)這里,可以...

    cyixlq 評論0 收藏0
  • 1 到完美,寫一個 js 庫、node 庫、前端組件

    摘要:從到完美,寫一個庫庫前端組件庫之前講了很多關(guān)于項(xiàng)目工程化前端架構(gòu)前端構(gòu)建等方面的技術(shù),這次說說怎么寫一個完美的第三方庫。使用導(dǎo)出模塊,就可以在使用這個庫的項(xiàng)目中構(gòu)建時使用功能。 從 1 到完美,寫一個 js 庫、node 庫、前端組件庫 之前講了很多關(guān)于項(xiàng)目工程化、前端架構(gòu)、前端構(gòu)建等方面的技術(shù),這次說說怎么寫一個完美的第三方庫。 1. 選擇合適的規(guī)范來寫代碼 js 模塊化的發(fā)展大致有...

    rollback 評論0 收藏0
  • 1 到完美,寫一個 js 庫、node 庫、前端組件

    摘要:從到完美,寫一個庫庫前端組件庫之前講了很多關(guān)于項(xiàng)目工程化前端架構(gòu)前端構(gòu)建等方面的技術(shù),這次說說怎么寫一個完美的第三方庫。使用導(dǎo)出模塊,就可以在使用這個庫的項(xiàng)目中構(gòu)建時使用功能。 從 1 到完美,寫一個 js 庫、node 庫、前端組件庫 之前講了很多關(guān)于項(xiàng)目工程化、前端架構(gòu)、前端構(gòu)建等方面的技術(shù),這次說說怎么寫一個完美的第三方庫。 1. 選擇合適的規(guī)范來寫代碼 js 模塊化的發(fā)展大致有...

    xiaolinbang 評論0 收藏0
  • 使用prince-cli,輕松構(gòu)建高性能React SPA項(xiàng)目~

    摘要:對模塊進(jìn)行了打包,監(jiān)聽文件更改刷新等功能,創(chuàng)建了個服務(wù),分別為靜態(tài)資源服務(wù)用于代理本地資源,與自刷新瀏覽器請求服務(wù)用于接受,請求,返回?cái)?shù)據(jù)服務(wù)用于收發(fā)消息。除了項(xiàng)目,還可以換成項(xiàng)目。項(xiàng)目地址如果覺得對你有所幫助,多謝支持 prince-cli 快速指南 這是一個為快速創(chuàng)建SPA所設(shè)計(jì)的腳手架,旨在為開發(fā)人員提供簡單規(guī)范的開發(fā)方式、服務(wù)端環(huán)境、與接近native應(yīng)用的體驗(yàn)。使用它你能夠獲...

    roundstones 評論0 收藏0
  • 0 到 1 再到 100, 搭建、編寫、構(gòu)建一個前端項(xiàng)目

    摘要:從到再到搭建編寫構(gòu)建一個前端項(xiàng)目選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架搭建一個前端項(xiàng)目的方式有兩種選擇現(xiàn)成的項(xiàng)目模板自己搭建項(xiàng)目骨架。使用版本控制系統(tǒng)管理源代碼項(xiàng)目搭建好后,需要一個版本控制系統(tǒng)來管理源代碼。 從 0 到 1 再到 100, 搭建、編寫、構(gòu)建一個前端項(xiàng)目 1. 選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架 搭建一個前端項(xiàng)目的方式有兩種:選擇現(xiàn)成的項(xiàng)目模板、自己搭建項(xiàng)目骨架。 ...

    call_me_R 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<